Здравствуйте, гость ( Вход | Регистрация )

> Как Сделаь На Сайте Статус, сайт....
egert
сообщение 30.9.2006, 18:05
Сообщение #1


**

Neophyte
Сообщений: 10
Регистрация: 9.9.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 7.742



короче я хочу штоб на сайте отоброшался статус сервер (скокс народу играет щяс - кто именно, скока вещей в мире на данный момент и т.д.) как это сделать??
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
Cold
сообщение 13.2.2008, 23:35
Сообщение #2


***

Novice
Сообщений: 88
Регистрация: 21.3.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 5.508



А можно вообще как-нибудь просмотреть содержимое Mobile ? А то я пробую вывести значение уровня и опыта, а мне выдаются ошибки. Если писать m_Level и m_Exp, то ошибка вот такая:
Код
Scripts: Compiling C# scripts...failed (1 errors, 0 warnings)
Errors:
+ Misc/WebStatus.cs:
    CS0103: Line 103: The name 'm_Exp' does not exist in the current context
    CS0103: Line 105: The name 'm_Level' does not exist in the current context

а если писать m.Level и m.Exp, то вот что:
Код
Errors:
+ Misc/WebStatus.cs:
    CS0117: Line 104: 'Server.Mobile' does not contain a definition for 'Exp'
    CS0117: Line 106: 'Server.Mobile' does not contain a definition for 'Level'


Попробовал сделать аналогию на гильдию:

Код
      op.Write( m.Map );
      op.Write( ")</strong></font></td><td><font color=\"#B00000\"><strong>" );
      if ( m != null )
     {
      Exp ex = m.Exp as Exp;
      op.Write( m.Exp );
     }
     else
     {
     op.Write ( "" );
     }
      op.Write( "</strong></font></td><td><font color=\"#B00000\"><strong>" );
      if ( m != null )
     {
      Level l = m.Level as Level;
      op.Write( l.Level );
     }
     else
     {
      op.Write( "" );
     }
      op.Write( "</strong></font></td><td><font color=\"#B00000\"><strong>" );      


Ну, и соответсвенно, ошибка:

Код
Errors:
+ Misc/WebStatus.cs:
    CS0246: Line 105: The type or namespace name 'Exp' could not be found (are y
ou missing a using directive or an assembly reference?)
    CS0117: Line 105: 'Server.Mobile' does not contain a definition for 'Exp'
    CS0246: Line 105: The type or namespace name 'Exp' could not be found (are y
ou missing a using directive or an assembly reference?)
    CS0117: Line 106: 'Server.Mobile' does not contain a definition for 'Exp'
    CS0246: Line 115: The type or namespace name 'Level' could not be found (are
you missing a using directive or an assembly reference?)
    CS0117: Line 115: 'Server.Mobile' does not contain a definition for 'Level'
    CS0246: Line 115: The type or namespace name 'Level' could not be found (are
you missing a using directive or an assembly reference?)


Может кто объяснит почему такие ошибки и что я делаю не так ? Вдруг, я близок к истине.


--------------------
Take me to the Breathe and BE...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Soteric
сообщение 14.2.2008, 2:08
Сообщение #3


********

Master
Сообщений: 1.377
Регистрация: 7.8.2006
Группа: Пользователи
Наличность: 450
Пользователь №: 7.166



Mobile - это класс входящий в состав ядра RunUO. Соответственно чтобы в него заглянуть нужно скачать сервер с помошью SVN (в соседней ветке форума подробно рассказано как это сделать). Ну и естественно вызывать ты можешь только методы и переменные, которые имеют флаг public. Т.е. ближе всего ты был к истине, когда писал m.Level и m.Exp. Форма записи верная, другое дело, что для Mobile не существует такого понятия как опыт и уровень. Об этом и сообщается в ошибках.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cold
сообщение 14.2.2008, 9:16
Сообщение #4


***

Novice
Сообщений: 88
Регистрация: 21.3.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 5.508



Ясно. Вот вырезка из моего playerMobile.cs ~76 строка:
Код
public class PlayerMobile : Mobile, IHonorTarget
    {
    /////////// Level System ////////////
        private int m_Level;
        private int m_MaxLevel;
        private int m_Exp;
        private int m_ToLevel;
        public int m_kxp;

        [CommandProperty(AccessLevel.GameMaster)]
        public int Level
        { get { return m_Level; } set { m_Level = value; InvalidateProperties(); } }

        [CommandProperty(AccessLevel.GameMaster)]
        public int MaxLevel
        { get { return m_MaxLevel; } set { m_MaxLevel = value; InvalidateProperties(); } }

        [CommandProperty(AccessLevel.GameMaster)]
        public int Exp
        {
            get { return m_Exp = LevelCore.TExp(this); }
            set { m_Exp = value; InvalidateProperties(); }
        }

        [CommandProperty(AccessLevel.GameMaster)]
        public int ToLevel
        { get { return m_ToLevel; } set { m_ToLevel = value; InvalidateProperties(); } }

        public int kxp
        { get { return m_kxp; } set { m_kxp = value; InvalidateProperties(); } }
        ////////// End Level System //////////


Вот тут вроде есть все те переменые и Level, и Exp. Только я не пойму, они private или public? Так что, если в "using Server.Mobiles" имеется ввиду playerMobile.cs, то в нем есть понятия об этих переменных. Почему же тогда он не хочет их выводить ? Или я что-то не так понял.


--------------------
Take me to the Breathe and BE...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Soteric
сообщение 14.2.2008, 14:46
Сообщение #5


********

Master
Сообщений: 1.377
Регистрация: 7.8.2006
Группа: Пользователи
Наличность: 450
Пользователь №: 7.166



В языке доступ к переменным класса осуществляется через так называемые методы-аксессоры (свойства). Например у тебя есть переменная private int m_Level; Как видно, ее модификатор (флаг) доступа private. Т.е. внутри класса PlayerMobile ты можешь беспрепятственно обращаться к ней, изменять ее значение, но за пределами PlayerMobile (как например в твоем случае) компилятор даст тебе ошибку (что-то вроде "variable m_Level сannot be accessed due to its protected status" - "переменная защищена и изменить ее невозможно"). Свойства реализуют доступ к таким переменным. Например:
Код
public int Level
{
    get { return m_Level; }
    set { m_Level = value; InvalidateProperties(); }
}

Это свойство имеет модификатор public и к нему можно обращаться из других классов. Если ты напишешь

m.Level = 10;

то произойдет следующее. В свойство поступит число 10 и будет присвоено переменной m_Level (выполнится метод set). Точно также если ты запрашиваешь значение этой переменной, например:

int x = m.Level;

то произойдет следующее. В свойство поступит запрос и метод get вернет (return) значение переменной m_Level. Поэтому private переменная всегда (если подразумевается ее использование в других классах) имеет свойство, через которое сообщает о себе другим классам. Это что касается модификаторов доступа.

Далее, почему он говорит, что у Mobile нет таких свойств. Их действительно нет, они есть у PlayerMobile. Это разные классы, хотя PlayerMobile является классом-потомком Mobile. А это значит, что у PlayerMobile есть все свойства класса Mobile, но у класса Mobile нет ни одного свойства класса PlayerMobile. Потомки наследуют все свойства и переменные от своих родителей, а родители в свою очередь ничего не знают о существовании своих потомков (по иерархии свойства передаются как бы сверху вниз и никак не снизу вверх, это очень важно понять). Конкретно о твоем примере. У тебя есть переменная m класса Mobile. Ты знаешь, что она является еще и PlayerMobile, но этого не знает сервер. Вот таким ходом:

PlayerMobile pm = (PlayerMobile)m;

происходит проверка является ли переменная m по совместительству PlayerMobile'ом и если является, то в новую переменную уже явно объявленную как PlayerMobile перекочевывают нужные тебе свойства класса-потомка. Пример:
Код
string name = m.Name; // Работает, потому что Name это свойство, определенное в классе Mobile
int level = m.Level; // НЕ работает, потому что Mobile понятия не имеет о свойствах своего потомка PlayerMobile

PlayerMobile pm = (PlayerMobile)m; // Не помню как это называется на умном языке, но для сервера это звучит примерно так: "Если m является PlayerMobile, то давай посмотрим какие там у него свойства и создадим новую переменную pm, включив в нее эти свойства". Если m не является PlayerMobile, то pm будет равна null
string anotherName = pm.Name; // Тоже можно, потому что PlayerMobile знает, что у класса-родителя есть такое свойство и помнит его значение
int anotherLevel = pm.Level; // Работает, потому что теперь мы ищем свойство Level не в классе Mobile, а в классе PlayerMobile


Вот так работают с переменными.

Теперь что имеется ввиду, когда мы пишем "using Server.Mobiles". Директивой using мы подключаем пространства имен. Можешь посмотреть, в каждом файле в начале идет что-нить вроде "namespace Server.Items" или "namespace Server.Mobiles" или "namespace Server.Network". Этой командой ты относишь класс к какому-либо пространству имен. Соответственно если ты хочешь, чтобы этот класс был виден в том классе где ты работаешь, то тебе нужно подключить его пространство имен. Например ты создал какой-нибудь класс и пытаешься создать в нем новую переменную:

Mobile m = new Mobile();

Сервер посмотрит по всем подключенным пространствам, не найдет в них класса Mobile и задаст вполне логичный вопрос "А че эта?" ("The type or namespace name 'Mobile' could not be found"). Чтобы этого не случилось, пишешь в заголовке using Server.Mobiles, подключив тем самым пространство имен Mobiles, содержащее в себе класс Mobile (не путай только пространство имен Server.Mobiles и класс Mobile - это не одно и то же; Mobile является составной частью Server.Mobiles).

В общем продолжай разбираться, ты на пути к просветлению (IMG:style_emoticons/default/biggrin.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
egert   Как Сделаь На Сайте Статус   30.9.2006, 18:05
Volonter   в папке misc файл wedstatus его изменяешь и все...   1.10.2006, 9:11
Barracoon   Или как очень, и очень неплохой вариант - можно ре...   2.5.2007, 4:51
Innos   Люди а может ктото прислать код каторый надо встав...   24.6.2007, 13:07
Soteric   Ранка периодически снимает данные с сервера и выво...   24.6.2007, 20:53
Innos   Мне надо например чтобы на сайте с боку было мини ...   24.6.2007, 22:39
Soteric   WebStatus.cs тупо создает файл с расширением html ...   25.6.2007, 20:15
Volonter   WebStatus.cs тупо создает файл с расширением html...   25.6.2007, 21:16
Soteric   Я не спорю с тем, что WebStatus может многое показ...   25.6.2007, 21:32
Barracoon   Я не спорю с тем, что WebStatus может многое показ...   26.6.2007, 18:21
Soteric   Остается только надеяться, что это хоть на 1% сдви...   26.6.2007, 21:49
Cold   По поводу WebStatus.cs. В нем есть строка ~ 36-я. ...   12.7.2007, 10:56
Barracoon   Пишу потому, что, допустим, Apache не видит страни...   12.7.2007, 13:01
Cold   А можно по-подробнее о выборке значений из netStat...   11.2.2008, 17:07
Soteric   Не совсем понял что требуется и о какой выборке ид...   11.2.2008, 18:16
Cold   Ну вот, как сделать выборку из этого массива что б...   11.2.2008, 22:07
Soteric   Этот массив не хранит данных о том, работает серве...   11.2.2008, 23:27
Cold   Ясно. Т.е., если я правильно понял, из Mobile я мо...   12.2.2008, 0:19
Soteric   Сделаешь, увидим. Хуже не будет   12.2.2008, 0:39
Cold   Во, спасибо большое! Сделал как ты посоветовал...   14.2.2008, 17:00


Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 1.8.2025, 1:25
Designed by Nickostyle