(с)
http://rbg.al.ru/spherehelp/Sphere Server 0.55 R3rc1[code]
09-12-2003
- Добавлены тэги в секции CHARDEF/ITEMDEF. Если аналогичный тэг присутствует на
экземпляре объекта, он перекрывает тэг в описании объекта (т.е. определённый в указанных
секциях)
10-12-2003, Kell
- Добавлен параметр OptionFlags в sphere.ini для установки различных опций. (далее OF_????)
- Добавлен OF_Magic_IgnoreAR = 0001 - армор класс не влияет на урон (для переписанных комбатов).
- Добавлен параметр ACTDIFF для чаров - "сложность" текущего действия (используется в расчётах
fail/success и шанса прироста скилла)
Рекомендации: ACTDIFF можно использовать, чтобы менять (задавать) сложность в триггере
@Start скиллов.
- Добавлен триггер @Effect в секции описания спэллов [SPELL x], вызывается после @SpellEffect
- <TAG0.xxx> - возвращает "0" в качестве значения по-умолчанию для тэгов (вместо "",
когда тэг не определён - смерть "0<tag.xz>" :).
- TAG0.xxx = yyy также может использоваться, если yyy = 0, то тэг не сохраняется (то же самое,
что "TAG.xxx=" )
Использование TAG0 позволяет иметь тэги, которые сохраняются только когда отличны от 0.
Удобно для тэгов, значение которых обычно 0, но которые часто используются
(например тэги, которые должны существовать на всех чарах).
- Добавлен VAR0 (то же, что и TAG0, но для глобальных переменных VAR).
11-12-2003, Kell
- Добавлен OF_Magic_CanHarmSelf = 0002 спэллы с флагом SPELLFLAG_HARM действуют на себя
- Изменена функция rand(x), теперь позволяет использовать 2-ой параметр, задавая тем самым
область, в пределах которой должно браться случайное число (от x до y-1)
12-12-2003, Kell
- Новый формат @color,font text для SYSMESSAGE и MESSAGE. Значения шрифтов от 0 до 9:
FONT_BOLD, // 0 - Жирный текст = большие буквы, как надпись "Server PAUSED..." :)
FONT_SHAD, // 1 - Текст с тенью = маленький, серый
FONT_BOLD_SHAD, // 2 - Жирный с тенью = что-то среднее между 2-мя предыдущими :)
FONT_NORMAL, // 3 - Нормальный (шрифт по-умолчанию)
FONT_GOTH, // 4 - Готический
FONT_ITAL, // 5 - Наклонный
FONT_SM_DARK, // 6 - Мелкий
FONT_COLOR, // 7 - Полноцветный шрифт (глючный?)
FONT_RUNE, // 8 - Символы рун (Только буквы в верхнем регистре!)
FONT_SM_LITE, // 9 - Мелкий
- Изменён SKILLMAKE, теперь позволяет выделять отдельные ресурсы (скиллы) из списка.
SKILLMAKE.1 возвращает 1-ый скилл, SKILLMAKE.1.VAL возвращает необходимое значение
и SKILLMAKE.1.KEY - имя скилла.
13-12-2003, Kell
- Добавлена функция RELEASE для НПС, то же самое, что команда "release", сказанная животному.
- Добавлен триггер @NPCFollow, вызывается, когда НПС следует за кем-то.
14-12-2003, Kell
- Изменена функция ATTACK - теперь понимает UID чара, которого следует атаковать, в качестве параметра
- Изменена функция TRY - убрана проверка на плэвел и достягаемость (CanTouch())
Кому нужны эти проверки - может использовать TRYP
(TRYP 0 проверяет только на достягаемость).
- Добавлено полезное ключевое слово в скрипты - "OBJ", используется как указатель на айтем.
Что-то вроде ACT, но может использоваться где угодно.
Например:
OBJ = <UID>
SAY You are <OBJ.NAME>, with uid <OBJ.UID>.
- Изменена функция MEMORY, понимает UID в качестве параметра, позволяет найти память для данного UID.
Если вызывается без аргументов, используется UID источника (SRC) как обычно.
Также может теперь использоваться для чтения/записи.
Пример:
MEMORY <SRC.UID> 0200 // set memory
SAY Memory flag regarding <UID> is <MEMORY.<SRC.UID>>.
15-12-2003, Kell
- Изменён @UserSkills, <argn1> теперь номер скилла, -1 - список всех скиллов
Позволяет запретить посылку ихменений скиллов клиенту.
- НПС не будут говорить "Yes Master", если задан SPEECHPET в sphere.ini (кому надо -
может сам прописать :) Если SPEECHPET не задан, они всё равно ничего не будут говорить до тех пор
пока не увидят своего хозяина (Удобно для ГМов). Игроки больше не будут отвечать "Sorry" на комадны ГМа.
- Добыча ресурсов изменена так, что проверяется SKILLMAKE добываемого айтема. Ресурсы, не прошедшие
проверку canmake игнорируются и в процессе выбора ресурса не учасвтвуют. Если вдруг почему-то
кому-нибудь захочется вернуться к старому стилю - просто закомментируйте строку со SKILLMAKE
в секции описания руды.
- return 1 в триггере @Step на айтеме теперь блокирует движение в том направлении (ой ли? :)
@Step на всех остальных айтемах в той же локации всё равно срабатывает.
- Добавлен OF_Skill_DiffFirst = 0008. Когда флаг установлен, сложность для скилла расчитывается
до вызоыва триггеров @Start/@SkillStart. Преимущество этого, что сложность может быть изменена внутри
этих триггеров через ACTDIFF. Чтобы "зафэйлить" скилл, ACTDIFF должен быть установлен больше текущего
(изменённого) скилла. Отрицательное значение ACTDIFF означает, что скилл будет отменён, т.е. не будет
вызываться @Fail и не будет расти скилл.
Пример установки сложности для скилла arms lore как минимум равному скиллу, необходимому для
изготовления вещи (первичному скиллу). У чара со скиллом больше ACTDIFF попытки будут всегда удачны.
ON = @Start
if ( <SRC.ACTDIFF> < <SRC.ACT.SKILLMAKE.1.VAL> )
SRC.ACTDIFF = <SRC.ACT.SKILLMAKE.1.VAL>
endif
16-12-2003, Kell
- Теперь можно использовать NEWITEM, NEWNPC и NEWDUPE на айтемах, указатель на созданный
объект - ключевое слово NEW. При использовании этих функций на чарах укзатели будут оба -
NEW и ACT. Если надо создать айтем или чара на другом чаре, не меняя его ACT, можно
использовать SERV.NEWITEM и т.д.
Пример:
NEWITEM i_gold
NEW.AMOUNT 100
NEW.P = <TOPOBJ.P>
NEW также может использоваться в качестве временного указателя на объект, как OBJ (или ACT)
17-12-2003, Kell
- Функциям, возвращающим значения, теперь могут передаваться текстовые аргументы в процессе
вызова, как например IF <SRC.myfunction Say hello> == 1
- Добавлен параметр RANGE=min,max или RANGE=max (min по-умолчанию 0) для описаний айтемов и чаров
(секции ITEMDEF и CHARDEF). Значение по-умолчанию для оружия и чаров - 1.
Суммарная дальность считается как RANGE чара + RANGE оружия - 1.
Например: Допустим у всех чаров RANGE=1 (как на самом деле и есть), установка RANGE=2 для алебадры
означает, что чар будет бить на 1 клетку дальше.
18-12-2003, Kell
- Основная секция диалогов [DIALOG x] теперь интерпретируется целиком как любой другой скрипт,
это позволяет добавлять логику в диалоги, использовать условия, и т.д.
Единственное ограничение на данный момент - это что команды гампов разрешены только в секции
диалогов, но не внутри функций, ну да пока и так сойдёт :)
- Диалоги больше не конфликтуют друг с другом. INPDLG тоже работает, т.к. только один INPDLG
одновременно может присутствровать на экране .
- Добавлен RESOURCES.n, RESOURCES.n.KEY и RESOURCES.n.VAL для айтемов/чаров.
19-12-2003, Kell
- Для более удобного написания диалогов добавлен "курсор" и относительные координаты:
dorigin 50 50 // установить кусор в позицию x=50, y=50
Использование символа "*" перед координатой обозначает, что координата считается относительно
положения курсора, и смещает курсор в новое положение:
dtext *0 *10 0 // курсор теперь в точке x=50, y=60
Использование символа "+" перед координатой обозначает, что координата считается относительно
положения курсора, сам же курсор при этом остаётся на месте:
dtext +10 - 0 // добавляет 10 к X
Как пример, представьте написание списка из 3-х столбцов на расстоянии 200 пикселей друг от друга
и расстояние между строками 20 пикселей:
dorigin 10 10
// первая строка
dtext *0 - 5 1:
dtext +10 - 0 the text for row1, col1
dtext *200 - 5 2: // x курсора = 200
dtext +10 - 0 the text for row1, col2
dtext *200 - 5 3: // x курсора = 400
dtext +10 - 0 the text for row1, col2
получится что-то вроде
1:the text for row1, col1 2:the text for row1, col2 3:the text for row1, col2
Для второй строки надо только сместить Y курсора на 20 вниз: "dorigin 10 *20",
остальной текст абсолютно идентичен (можно даже организовать цикл, операторы для которого
которого добавлены позже :)
- Исправлен баг с FORCHARS/ITEMS/OBJS и ключевыми словами, начинающимись с "FOR" (типа FORensics).
- Изменены textadd и gumptext для объединения эквивалентных строк под одним индексом.
Так что для записи
gumptext 10 20 This is an example.
gumptext 10 40 This is an example.
gumptext 10 60 This is an example.
сфера создаст только 1 текстовый ID. Это делает ненужным существование отдельной секции
[DIALOG ... TEXT]. Хотя, подобная секция удобна для хранения всех строк в одном месте.
В общем кому как больше нравится :)
20-12-2003, Kell
- Одинаковые плэвелы должны видеть друг друга, собственно что они теперь и делают :)
- Теперь можно открывать дилоги на определённой странице, формат DIALOG d_dialog_name pagenumber.
- Добавлена новая команда DTEXT в диалоги, которая заботится об обработке текста сама:
dtext x y color Actual text comes here.
Текст, добавленный подобным образом, на самом деле автоматически добавляется в секцию
[DIALOG ... TEXT]. Если приведённый текст используется только 1 раз, то это обрабатывается быстрей,
чем использование обычного "text" и добавление текста в секцию [DIALOG ... TEXT].
Также добавлены аналогичные комманды DCROPPEDTEXT и DTEXTENTRY, где вместо индэкса строки также
напрямую используется текст. Также добавлена команда DHTMLGUMP, синтаксис такой же, как HTMLGUMP,
за исключением того, что индэкс строки текста убран, а сам текст следует последним.
- Команды гампов (диалогов) теперь можно использовать в теле функций! Т.е. теперь по сути возможно
создавать собственные команды для диалогов! Смерть copy&paste диалогам! :)
21-12-2003, Kell
- Аргументы в функциях теперь изменяемые. Некоторые из триггеров читают изменённые значения
аргументов и используют их там, где это может на что-то повлиять. На данный момент это триггеры:
@GetHit, ARGN1 - наносимый урон, ARGN2 - тип урона (как обычно, но теперь их можно менять).
@Hit, ARGN1 - базовый урон, без учёта армора (изменяемый). ARGO - оружие (если есть).
@PersonalSpace, ARGN1 - стамина, необходимая для движения (изменяемый).
"return 1" запрещает движение, "return 0" разрешает движение и не пишет никаких хардкодовых
сообщений, "return" или вообще отсутсвие return'а - действия по-умолчанию.
ARGO в @Hit, @HitTry и @HitMiss также указывает на оружие (так что не нужно искать его по слоям :)
Также хочется заметить, что ACTDIFF тоже доступен и может использоваться для изменения сложности
скилла, даже заставить скилл сработать тогда, когда он должен бы сфэйлить (присвоив ACTDIFF=0).
Также теперь он может быть доступен в @HitTry, и если присвоено любое неотрицательное значение,
вместо попадания будет промах.
- Добавлена функция StrEat, удаляет из строки слово до пробела (<streat("hello there friend")>
или <streat hello there friend> возвращает "there friend")
- Доавлен <SERV.LOOKUPSKILL skill name>, возвращает номер скилла по имени или -1,
если скилл не найден.
- Пара фиксов в диалогах.
- LOCAL.xxx в теле функций для локальных переменных. Они чуть более эффективны нежели куча глобальных
переменных из-за более быстрого поиска в меньших массивах строк. Локальные переменные всегда
инициалихзируются со значением "0".
- ARGN1, ARGN2 и ARGN3 определены для функций с численными аргументами. Так что когда возможно, лучше
использовать их вместо argv. Например: "myfunction 123 50 89" - эти 3 значения будут
находиться в ARGN1, ARGN2 и ARGN3.
22-12-2003, Kell
- Функции теперь могут возвращать строки, используя "return". При этом они ведут себя как тэги -
т.е.
return 2+2
возвращает строку "2+2", а не "4". Для того, чтоб возврщало "4" придётся принудительно вызывать
"eval":
return <eval (2+2)>
С этим могут возникнуть проблемы, если где-то используется "return rand" или что-нибудь вроде того,
вместо "return <eval rand..."
ДЕВЕЛОПЕР! УБЕДИСЬ, что используешь "EVAL" в строках с "return", если хочешь, чтоб они обсчитывались
перед тем, как возвращаются! :D В следующей версии, видимо, не будет флага EF_ReturnString.
- Изменены функции профайла для слежения за средними показателями. Среднее время считается каждую
секунду как 90% от предыдущего показателя среднего времени + 10% текущего времени.
- Добавлено новое ключевой слово в триггеры @Create / @NPCRestock и скрипты темплэйтов:
FULLINTERP. FULLINTERP=1 позволяет использовать там функции, условия и т.д.
Например:
ON = @NPCRestock
ITEM=i_cape
FULLINTERP
ITEM=i_robe
MY_FUNCTION_CALL
FULLINTERP 0 отключает эту возможность после того, как она была включена, но это обычно
нафиг не нужно :), т.к. FULLINTERP затьрагивает только оставшуюся часть текущего скрипта.
Необходимо помнить, что при этом накладываются определённые ограничения, т.к. NPC ещё не
находится в мире.
23-12-2003, Kell
- Добавлен доступ к параметрам TERRAIN и STATICS либо через P.key, MOREP.key, либо через
SERV.MAP(x,y).key, где key один из следующих:
TERRAIN ID тайла карты
ISDIRT проверяет ID на предмет приндалежности оного к грязи :)
ISGRASS трава?
ISROCK камень (скала)?
ISWATER вода?
STATICS количество статических айтемов в данной точке
STATICS(n) ID энного статического айтема (Например: <SERV.MAP(200,300).STATICS(0)>.
Не вызывает ошибок в консоли, если айтем не существует, просто возвращает 0 - удобно для
проверки на статику без пересчитывания и циклов)
STATICS.n то же самое
STATICS(n).key доступ к полям соответствующего ITEMDEF.
Например: <SERV.MAP(200,300).STATICS(0).NAME>
- Добавлены базовые циклы, WHILE, ситаксис:
WHILE ( выражение )
// тело цикла, текущий номер повторения в <LOCAL._WHILE>
END // или ENDWHILE
также добавлен оператор FOR, заканчивается оператором END или ENDFOR, синтаксис:
FOR 5 // повторяться от 0 до 5, текущий номер повторения в LOCAL._FOR
или FOR 3 5 // повторяться от 3 до 5, текущий номер повторения в LOCAL._FOR
или FOR K 5 // повторяться от 0 до 5, текущий номер повторения в LOCAL.K
или FOR K 3 5 // повторяться от 3 до 5, текущий номер повторения в LOCAL.K
// бла бла бла
END // или ENDFOR
Изменение данных локальных переменных не оказывает влияния на цикл.
- Изменён шрифт в консоли Windows на Courier, у него буквы одинаковой ширины, так что строки в
консоли выглядят выровнеными.
- Теперь можно добавлять свои секции [SKILL x], до 70. SERV.MAXSKILLS - сколько скиллов загружено.
Однако они не будут посылаться клиенту, т.к. клиент их не поддерживает (hint: @UserSkills).
Также добавлен параметр FLAGS в секции [SKILL x], значения флагов следующие:
[DEFNAME skill_defs]
SKF_SCRIPTED 01 // Нет хардокодовых действий, только триггеры срабатывают.
// можете добавлять свои флаги сколько угодно, но желательно после 01000, дабы оставить место
для будущего расширения.
Ну это всё, как обычно, очень эксперементальное, так что используйте, естественно,
на свой страх и риск :)
- SKILLSELECT skill - "нажать" кнопку соответствующего скилла (если скилл с кнопкой)
24-12-2003, Kell
- Исправлен баг, когда типы в секции [TYPEDEFS] теряли свои значения при ресинке.
- Добавлена функция <CANMOVE dir>, аргумент - направление (как для WALK),
возвращает ID рагиона, в который "идём" или 0, если проход блокирован.
- Добавлена функция <MOVE dir>, аргумент - направление (как для WALK), возвращает флаги
для тайла в указанной точке. Флаг 04 - можно ходить. Полный список флагов кто-то потёр :)
Данне ключевое слово может быть изменено в будущем.
27-12-2003, Kell
- добавлена поддержка цвета и режима проприсовки для EFFECT. Если не указаны - используются старые
пакеты, иначе новые. Проверено и работает на клиентах, начиная с 2.0.3 (вообще должно работать
на всех клиентах 2.0.* серии).
- Поддержка клиентов 3.0.*, должны нормально работать, вплоть до LBR (Они в общем-то итак работали,
просто флудили ошибками в консоли).
- Добавлен оператор (%) для численных выражений (например: 12 % 3 == 0).
- Добавлена команда SENDPACKET для клиентов. Для более удобной посылки слов (WORD, 2 байта) и
двойных слов (DWORD, 4 байта) можно использовать префиксы 'W' и 'D' соответственно (также
поддерживается префикс 'B' для байтов, но он обычно не нужен). Как пример - установка уровня
освещённости для клиента:
SRC.SENDPACKET 04e D<SRC.UID> 20
04e и 20 могут использовать префикс 'B', заметьте как <SRC.UID> использует префикс 'D',
чтобы указать, что оно занимает 4 байта (двойное слово).
Также необходимо заметить, что каждый параметр сначала обсчитывается и обрезается, и только
потом используется. Так что если, например, использовать 0fffffffe (который в общем-то далеко
не байт :) на месте, где предполагается использование байта, то оно превратится в 0fe.
Если поставить туда (2+2), оно посчитается и станет "4" перед использованием.
28-12-2003, Kell
- Добавлены параметры OSTR, ODEX, OINT для чаров.
- Добавлены параметры MODSTR, MODDEX, MODINT - модифицированные статсы, спэллы теперь меняют их.
Статсы начинают падать только если сумма O-статсов больше статкапа, модифицированыые статсы в
статкапе не учитываются.
- STR, DEX и INT теперь всегда равны O + MOD. Если у чара OSTR=50, MODSTR=0 и потом ему меняется
STR=60, то его MODSTR становится равным 10 (а OSTR не меняется).
*** ИЗМЕНЕНО! *** См. запись от 19-01-2004
- Добавлены MAXHITS/MAXMANA/MAXSTAM. Если 0, используется максимальное значение по-умолчанию
(например, MAXSTR по умолчанию равно STR). (Для значения по-умолчанию надо присваивать пустую
строку, а не 0, например:
MAXHITS=
т.к. там учитываются модифицированные статсы.
MAX всегда содержит MOD для соответствующего статса. Т.е. если у чара MAXHITS=100 и MODSTR=10,
на самом деле MAXHITS записано, как 90, и при изменении MODSTR меняется и MAXHITS. Это для
совместимости со спэллами, меняющими статсы, т.к. те меняют не только статсы, но и максимальные
значения hits/stam/mana.
- Теперь можно использовать тэги на аккаунтах. Оба TAG и TAG0 доступны.
- Исправлен LOCAL._WHILE внтури циклов WHILE.
- Изменена секция BUTTON диалогов, теперь монимает формат
ON = min max
для похожих действий на нескольких конпках - используется, если ID конпоки попадает между min и
max (включительно). ARGN1 - ID кнопки, которая на самом деле нажата (даже если указан не диапазон,
а всего одна конопка, как обычно).
29-12-2003, Kell
- Исправлен баг, когда некоторые скилл не завершались корректно, если другой скилл использоволся до
того, как они завершились. Например спэллы не физлились, если использовать какой-то скилл до
окончания каста.
- Для скиллов триггер @Fail теперь вызывается, когда неудача произошла в результате нормальной
работы скилла (например, фэйл из-за высокой сложности). Триггер @Abort вызывается, когда скилл
"сбивается" каким-либо образом, например использованим другого скилла, или в результате каких-то
ошибок (выбросили реги после начала каста).
Если @Fail взывается, это означает, что скилл будет расти, хоть и медленней, но при использовании
"return 1" в теле триггера скилл расти не будет (см. MANUAL.TXT).
- Начал реализовывать нормальную работу для EF_CanSeeLOS. На данный момент она проверяет высоту
статических айтемов на пути к цели.
- Использование слова "SECTOR" для доступа к параметрам сектора теперь обязательно. Так что для
доступа к параметрам "light" или "rainchance" надо использовать SRC.SECTOR.RAINCHANCE, в то
время как раньше можно было просто SRC.RAINCHANCE. У этого есть несколько преимуществ -
люди итак уже обычно используют SECTOR, так что это позволяет быстрей обрабатывать команды
на чарах, т.к. меньше строк для проверки.
30-12-2003, Kell
- Исправлен небольшой баг с кармой/фэймом.
- Добавлен параметр FEATURES= в sphere.ini, для задания возможностей, которые сервер включит
в клиенте в процессе соединения:
0001 - (T2A) включить кнопку чата
0002 - (LBR) включить звук из LBR (играет MP3'шки вместо MIDI)
0004 - (T2A) включить T2A апдэйт
0008 - (LBR) включить LBR апдэйт (показывать монстров)
Стандартная .55i автоматически включает 0001, но теперь его можно выключить :)
- Добавлена команда DIALOGCLOSE. Первый аргумент - имя диалога для закрытия, 2-ой аргумент -
кнопка, нажатием которой закрывается диалог (по-умолчанию 0)
пример:
DIALOGCLOSE d_my_dialog
Можно вставить эту команду одной из 1-ых в секцию диалога, чтобы быть увереным, что только
один диалог данного типа одновременно открыт у клиента.
02-01-2004, Kell
- Добавлены ключевые слова для управления соединением в sphere.ini, значение 0 отключает
любую из этих установок.
Убедитесь, что знаете, что вы делаете, при установке этого:
* ConnectingMax=x, где x - максимальное количество клиентов, которые могут одновременно
быть подключёнными к серверу, но не находиться в игре (http, логин и т.д.).
Самые старые клиенты, которые до сих пор не в игре, отключаются при коннекте новых.
Значение по-умолчанию: 24
* ConnectingMaxIP=x, То же самое, но с одного IP. Т.е. максимальное количество клиентов с
одного IP, которые могут одновременно быть подключёнными к серверу, но не находиться в игре.
"not in game" connections will be allowed per IP. Notice that HTTP
Значение по-умолчанию: 8
* ClientMaxIP=x, максимальное количество соединений с одного IP. ЗНАЧЕНИЕНЕ СЛЕДУЕТ УСТАНАВЛИВАТЬ
СЛИШКОМ МАЛЕНЬКИМ, или вы рискуете выглядеть глупо :) Куча ситуаций, когда соединения могут
исходить с одного IP, компьютерные клубы - самая распространённая из них.
Значение по-умолчанию: 0
- Исправлена серьёзная проблема, когда ошибки при логине могли оставлять висящими сокеты.
- В сообщениях о коннекте/дисконнекте теперь 2 номера после IP-адреса.
1-ый - количество соединений с данного адреса, которые не в игре, 2-ой - общее число соединений
с данного адреса.
- В файлы мира OSTR и MODSTR теперь сохраняются вместо STR. Если встречается "STR",
она интерпретируется как OSTR. Это неплохо работает для конвертирования старых сэйвов,
даже если чар под воздействием спэллов, меняющих статсы, т.к. они "просто"
делают MODSTR отрицательным (ага, с таким "просто" мы потом статкапа фиг когда достигнем :)
ЗЫ: это работает применительно ко всем статсам, STR - это просто как пример.
- Если в перывй раз устанавливается какая-либо характеристика для НПС, когда Ostat = 0,
сфера установит Ostat, а не MODstat. Другими словами, если в триггере @Create стоит
STR=20, у НПС будет OSTR=20 и MODSTR=0. Если потом написать STR=30 на том-же НПС,
OSTR останется 20, а MODSTR станет равна 10.
*** ИЗМЕНЕНО! *** См. запись от 19-01-2004
- Исправлен небольшой баг, когда спеллы, меняющие статсы, не проставляли правильно MODstat.
03-01-2004, Kell
- Добавлены унарные операторы "*=", "+=", "-=", "/=", "%=", "|=", "&=" and "!=" (стиль C).
На самом деле сфера просто заменяет строки формата
XXX += YYY
на
XXX = <eval (<XXX> + (YYY))>
Так что теперь можно писать
MANA += 10/2 // то же, что и MANA = <eval (<MANA> + (10/2))>
ATTR &= ~attr_magic // то же, что и ATTR = <eval (<ATTR> & (~attr_magic))>
- Добавлен оператор ".=", соединяет строки.
На самом деле сфера просто заменяет строки формата
XXX .= YYY
на
XXX = <XXX>YYY
Тут подразумеваются параметры, поддерживающие текстовые значения (NAME, TITLE, VAR, LOCAL и т.д.)
- Первая попытка реализовать нормальную проверку линии видимости (LOS) с учётом z координаты.
Чтобы цель была видна, мы должны быть в состоянии дойти напрямую до неё (здесь ничего нового),
и заончить путь на допустимой высоте. Так что можно увидеть объект на возвышенности, но нельзя,
если вы на этаж ниже его. Всё это особо на производительность не влияет, так что можете включить
эту возможность установкой флага EF_CanSeeLos (04).
- Хотьба по диагонали (например NW) возможна только если чар может пройти в оба из ортогональных
направлений (NW -> N и W). Это исправляет несколько эксплоитов со стороны клиента, а также
НПСей, ходящих через углы, Yew tree и т.д. Включается установкой флага EF_DiagonalWalkCheck (010)
- Для определения высоты, находясь на которой над айтемом чар будет вызывать триггер @Step, теперь
используется высота самого айтема, а не хардкодовое значение "3". Это позволяет иметь триггеры @Step
на столах, которые будут срабатывать, когда чар стоит на нём.
- Если в триггере @SpellEffect не опрпеделён источник (SRC), то источником принимается сам чар,
на котором сработал триггер. Исправляет баг с исключениями (Critical exceptions) при вызове функции
SPELLEFFECT на таймере и т.д.
- Добавлены триггеры @NPCLookAtChar и @NPCLookAtItem (см. manual.txt). Не следует ими злоупотр<вырезано анти-матом>ть,
т.к. они могут повлиять на производительность.
04-01-2004, Kell
- Добавлена функция ISNEARTYPE, первый аргумент - тип, 2-ой - максимальная дистанция для поиска
(по-умолчанию 4). Также формат ISNEARTYPE.P, возвращает "0", если ничего не найдено, или
координаты найденного объекта.
- Изменена функция DISTANCE, теперь понимает UID объекта, до которого надо измерить расстояние,
в качетсве параметра, либо координаты точки. Так что теперь можно использовать запись типа
<DISTANCE <MOREP>> <DISTANCE trinsic> <DISTANCE <SRC.ACT.UID>>
Если аргументов не указано, считает расстояние до источника (SRC), как обычно.
Если передаются неверные координаты или несуществующий UID - пишет ошибку в консоли.
- TIMERD теперь читаемый (десятые доли от TIMER).
- Убрана проверка на видимость из USEITEM. Ибо весь смысл данной команды - активизирование айтема
из скриптов, без проверки на достягаемость. Тогда, собственно, нафига там нужна проверка на
видимость? :) Все эи тесты выполняет DCLICK. Ключевое слово "USE" итак позволяло использовать
формат "USE 0", чтобы не проверять на достягаемость, но также проверяло на видимость.
Больше не проверяет;)
- Биты спавнов меняют свой вид сразу после изменения MORE1.
- Даблклик по уже сброшенному (more2=0) спавну чаров устанавливает ему таймер 1, так что он
респавнится через секунду.
- Добавлена команда MOVENEAR для объектов (айтемов/чаров). 1-ый аргумент - UID айтема, рядом
с который двигать, 2-ой аргумент - дистанция. 3-ий аргумент, если присутсвтует и
равен "0", то айтем не посылает апдэйт пакетов.
Пример:
ON = @DClick
MOVENEAR <SRC.UID> 5 // подвинуть на 5 шагов от SRC
При этом подобное передвижение учитывает стены и т.д. (возможность попасть отсюда в ту точку,
удобно для переписывания спавнов).
- Установка ARGN1=1 в @Login запрещает показывать скролл MOTD.
05-01-2004, Kell
- Исправлен эксплоит с '\n' в textentry и inpdlg.
- Секции AREA и ROOM в формате
[AREA name here]
Теперь лучше использовать в формате
[AREADEF a_some_def] // ROOMDEF для комнат
NAME=name here
Так оно ресинкается без конфликтов регионов.
Совет: Держите регионы в разных форматах в разных файлах. Или найдите скрипт для
конвертирования из старого формата в новый, или ручками :)
Секции [Teleporters] и [Moongates] уберите в отдельные файлы (т.к. они не ресинкаются).
Замечание: Не обязательно использовать новый формат. Однако ж это рекомендуется, т.к.
позволяет изменять регионы без перезапуска сервера.
Все последующие возможности сохранения всяких тэгов и т.д. в регионах будут доступны
только для регионов в новом формате (или для регионов ,у которых определён DEFNAME).
- Добавлна инструкция CALL для вызова функции, но разделяя локальные переменные с вызвавшей функцией.
Очень удобно для разбиения функции на мелкие куски, не функционирующие по-отдельности.
Другими словами, если вызвать функцию при помощи CALL, все локальные переменные вызывающей из
текущей функции будут доступны в вызываемой функции и наоборот (переменные, объявленные внутри
вызываемой функции будут доступны в вызывающей после окончания работы вызываемой %)
[FUNCTION myfunction1]
LOCAL.VAL1 = 12
CALL myfunction2 1, 2 // LOCAL.VAL1 будет доступна в myfunction2
// если LOCAL.VAL1 изменится в myfunction2, она также изменится и здесь.
Если вызываемой функции не передавать аргументов, то аргументы вызывающей (args/argn/argv)
также будут разделены, и весь процесс быстрей, нежели вызов функций без CALL. Если передавать
аргументы в функцию, то разделяются только локальные переменные, и сам процесс немного медленней.
Незаметно, но в принципе.
Это также может использоваться, как <CALL Function ...>, быстрей без аргументов, медленней с.
- Вдруг осознал, что ВСЕ DEFNAME'ы доступны через VAR. Это означает, что все itemdef'ы, chardef'ы,
и т.д. имеют записи в списке глобальных переменных VAR (можете попробовать <VAR.i_dagger>).
Это есть потенциальная причина многих проблем.
1) Когда сфера пытается получить доступ к глобальной переменной VAR, она ищет её среди ВСЕХ
существующих дефнэймов (на разных серверах от 2-3 до 5-10 тысяч :).
2) Вы можете нечаянно создать переменную с именем, таким же, как у какого-нибудь айтема, и...
ну в общем понятно :)
Теперь VAR/VAR0 содержат только глобальные переменные, которые могут изменяться, а доступ к
дефнэймам осуществляется через DEF/DEF0 и они не изменяемые. Разница в скорости заметна
невооружённым глазом :) Раньше каждый раз, когда использовался VAR, сфера искала его имя во всём
списке дефнэймов из несколькоих тысяч элементов. Теперь же каждое обращение ищет имя только в
списке из переменных, созданных вашими скриптами (количество которых даже на шардах-экстремалах
по-идее не должно превышать сотни :).
Это также позволяет сохранять глобальные переменные в мире.
Хотя это довольно здоровое изменение во внутренностях сферы, оно почти не влияет на скрипты, за
исключением ситуаций, когда:
1) Вы создали DEFNAME флаг в скриптах и меняете его во время работы сервера. Это очень
нетипичная ситуация, но если вам это надо - вы можете просто один раз создать VAR в скриптах,
она сохранится в spherevers.scp (Почему? Очень даже типичная - временные флаги, действующие до
ручного отключения и сбрасывающиеся при перезапуске сервера - такая удобная вещь была для
квестов :)
2) Вы используете дефнэймы через VAR. Однако повода для этого я не вижу, т.к. DEF'ы / VAR'ы
могут использоваться без префикса "VAR." (Не всегда, есть пара ситуаций, когда не могут :)
Если не использовать префиксы DEF или VAR to для доступа к переменным, то сначала берётся VAR,
если существует, если же нет, то DEF, т.е. старый формат сохранён.
- VAR'ы теперь сохраняются в spheredata.scp. Если при загрузке сфера не обнаружит данного файла,
она выдаст предупреждение, но продолжит загружаться и создаст файл при следующем сохранении мира.
- GM пэйджи также сохраняются в spheredata.scp. Слишком много людей заинтересованы в обработке оных
для создания всяких вэб интерфэйсов или скриптов для Mirc, Так что теперь им не надо читать весь
мир для этого.
06-01-2004, Kell
- Добавлен флаг "S" для SENDPACKET, позволяет посылать строки напрямую. Если строка не в кавычках,
она заканчивается после первого пробела. Пример:
SENDPACKET 00 S"This is the string to send" 0
SENDPACKET 00 SUpToTheSpace 0
Если строка должна заканчиваться нулевым символом, просто поставьте там 0 как показано выше.
Иначе скорее всего придётся указать длину строки (функция strlen) - в зависимости от пакета.
- Добавлен новый код огранечителя скорости передвижения: существует максимальная скорость, с
которой чар может двигаться. Если чар передвигается быстрей заданой скорости, каждую десятую
долю секунды он теряет "единицу хотьбы", каждую десятую долю секунды, в которую чар
передвигается медленней ожидаемой скорости, он получает дополнительную единицу.
Количество единиц, с которыми чар начинает и максимальное количество единиц задаются параметром
WALKBUFFER в sphere.ini. Я тестировал это со значениями около 40 для хороших соединений и 70 для
лагающих. Если игрок на спидхаке, его буффер скоро окажется < 0 и он не сможет двигаться
и ему придётся компенсировать это периодами медленной хотьбы, как в лаге.
WALKREGEN - скорость регенерации единиц хотьбы, в процентах (от чего? :).
Значения по-умолчанию: WALKBUFFER=50 WALKREGEN=25
Hints:
WALKBUFFER чем меньше - тем строже контроль. Однако, слишком низкие значения могут "поймать"
кого-то, кто просто сильно лагает. Следует увеличить это значение при уменьшении
WALKREGEN.
WALKREGEN чем меньше - тем дольше "лагает" потом чаров. Имеет смысл уменьшить значение при
увеличении WALKBUFFER.
- Удалены некоторые EF_ флаги, которые более не нужны, т.к. ничего страшного от них, судя по всему,
не случается. Убедитесь, что прочитали MANUAL.TXT.
- Изменён триггер @DropOn_Item и @ItemDropOn_Item, теперь вызывается при бросании айтемав контэйнер.
Вызывается, когда айтем с триггером брошен на другой айтем.
- добавлен триггер @DropOn_Self и @ItemDropOn_Self, вызываются, когда на айтем с триггером брошен
другой айтем.
- Введены триггеры @DropOn_Char и @ItemDropOn_Char.
- при выходе из этих триггеров по "return 1", айтем упадёт обратно в пак только тогда, когда всё ещё
"перетаскивается" (в слое layer_dragging). Это позволяет задавать новое место для айтема в теле
триггера.
- Клиенты могут класть вещи в банк только если стоят на том же месте, где его открыли.
Это также теперь может проверяться в скриптах.
- Исправлен Injection эксплоит, позволявший получать доступ к банку в любой точке мира.
- Добавлены триггеры @SkillGain и @Gain (см. MANUAL.TXT).
07-01-2004, Kell
- Автоматическое присваивание дефнэймов для регионов, объявленных в старом формате
(AREA / ROOM). Этот дефнэйм строится из имени и делается уникальным путём добавления
к имени номера.
- В консоли сервера можно набрать "d a" - сфера сохранит все регионы в новом формате в
файле "map_all.scp". Я настоятельно рекомендую заменить старый файл карты этим файлом,
т.к. это позволит окончательно уйти от старого формата.
Замечение: Телепортеры и мунгейты не сохраняются в данном файле, так что их лучше заранее
засунуть в отдельные файлы, чтобы регионы могли нормально ресинкаться.
- Ещё раз не менее настоятельно рекомендовано выполнить все операции, описаные выше, т.к.
это даёт следующие преимущества:
* Загрузка будет осуществляться быстрей, т.к. сервер не будет генерить дефнэ