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

 
Ответить в эту темуОткрыть новую тему
> Taran's Scripting For Dummies - Rus
DihlofozzZ
сообщение 14.8.2008, 0:29
Сообщение #1


***********

Администратор форума
Сообщений: 5.602
Регистрация: 8.3.2003
Группа: Администраторы
Наличность: 0
Из: Москва Россия
Пользователь №: 237



Объекты Памяти
Дополнительный контроль над теми вещами которые вам настолько дороги

Что общего между следующими вещами?

- Война
- Гильдии
- Приручение животных
- Наем NPC
- Воровство и преступники
- @NPCSeeNewPlayer

Если вы обладаете небольшую частицой интеллекта (IMG:style_emoticons/default/smile.gif) и смотрите на название статьи, вы могли бы предположить, что эти концепции имеют некоторое отношение к мемори итем (Сорри не нашел подходящего слов под memory items). Фактически, прямо в начале этого обучающего описания, я собираюсь представить вам новый объект:

MEMORYFINDTYPE

Поскольку вы можете предположить, если вы читали другие описания относительно таких команд как FINDLAYER и FINDTYPE, эта команда берет один аргумент, который может быть отделен от всего или набором круглых скобок или периодом. Какие аргументы мы можем иметь? Хорошо, еще раз мы идем к нашему удобному SPHEREDEFS.SCP файлу для ответа!

Код
[DEFNAME MEM_FLAGS] 
MEMORY_SAWCRIME 00001
MEMORY_IPET 00002
MEMORY_FIGHT 00004
MEMORY_IAGGRESSOR 00008
MEMORY_HARMEDBY 00010
MEMORY_IRRITATEDBY 00020
MEMORY_SPEAK 00040
MEMORY_AGGREIVED 00080
MEMORY_GUARD 00100
MEMORY_ISPAWNED 00200
MEMORY_GUILD 00400
MEMORY_TOWN 00800
MEMORY_FOLLOW 01000
MEMORY_WAR_TARG 02000
memory_friend 04000


Давайте посмотрим сначала на некоторые примеры команды, так вы сможете видеть, что она делает. После чего я буду понемногу объяснять, что вы можете делать с этим.

Код
ON=@DClick 
if <src.memoryfindtype.memory_guild.link>==<uid>
src.sysmessage You are in this guild!
else
src.sysmessage You are not in this guild!
endif


Это - пример синтаксиса команды. Кстати, все объекты памяти – одного типа, i_memory. Они сохранены непосредственно на вашем персонаже. Если вы хотите большее кол-во доказательств, зайдите в игру, и напечатаете .edit. Выскочит окно с описанием вашего персонажа. You'll see a bunch of tiles labelled NoDraw in tiny yellow text
Те мемори итемы, которые соответствуют различным вещам, ваш персонаж, как предполагается, "помнит". Конечно, эти единственные работы, если ваш персонаж имеет что либо, чтобы помнить.
Какой вид вещей помнят объекты памяти ? Хорошо, давайте проходить каждый полезный тип по одному, и я буду давать некоторые примеры скрипта, чтобы демонстрировать их использование.

MEMORY_IPET- Это - вероятно один из наиболее полезных типов памяти. Этот тип показывает, к примеру: персонаж - домашнее животное, и что этот объект памяти будет содержать информацию относительно владельца персонажа. Кто-нибудь задавался вопросом, как персонаж знает кто его приручил? Имеются свойства MEMORY_IPET объекта памяти:
• MORE1 – Это всегда было 04, в любое время, я видел это в скрипте. Я всегда не изменял это.
• MORE2 - переменная <serv.time>, задает время когда существо было приручено. <Serv.time> - постепенно увеличивается.
• MOREP - Это - местоположение, в котором имело место приручение.
• LINK - Это - наиболее важная переменная, она содержит UID владельца. Вы можете использовать эту переменную, чтобы непосредственно изменить владельца, или проверить, действительно ли, специфический игрок – является владельцем. Вы можете также изменять эту переменную, чтобы изменить владельца, который является особенно полезной особенностью.
• CONT - Это - ссылка на существо, которым вы будете иметь другой путь к доступу. This is a reference to the creature, which you will usually have another way to access

Есть скрипт примера, чтобы иллюстрировать возможное использование MEMORY_IPET. Этот - скрипт, который у меня часто просят по ICQ. Это заставит недавно созданное существо быть прирученным специфическому игроку. Мы будем использовать это в форме функции для непринужденности и мобильности:

Код
[FUNCTION summontame] 
if (0<ARGS>==0)
sysmessage Usage: summontame <id>
endif
newnpc <args> // Делаем новое существо
act.p <p> // Поместите новое существо в позицию где оно будет создано
var.npcuid <act.uid> // Храните UID NPC в временной переменной
newitem i_memory // создаем новый мемори итем
act.color memory_ipet // Да, мы настроим цвет. Это - то, где хранится тип памяти.
act.more1 04
act.more2 <serv.time>
act.morep <p>
act.link <uid>
act.cont <var.npcuid> // Мы хранили это в этой переменной, потому что NEWITEM заменил бы переменную ACT
return 1


Эта команда используется персонажем. Например:
This command is used by referring to a character when using it. For example:

Код
ON=@Dclick 
src.summontame c_horse_gray
return 1


MEMORY_GUILD - Наиболее важный аспект этого объекта памяти - LINK, которая содержит UID гильдстоуна(guildstone). Это позволяет вам проверять, находится ли персонаж в какой либо гильдии, если персонаж находится в гильдии со всеми (недостаток этого объекта), или если два персонажа находятся в той же самой гильдии. Поскольку LINK - единственный важный признак этого объекта памяти, я не собираюсь делать описание подобно вышеупомянутому объекту:
• Проверяем, находятся ли, два игрока в одной гильдии (игрок 1 - SRC, игрок 2 - дефаултный объект):
if ( <src.memoryfindtype.memory_guild.link>==<memoryfindtype.memory_guild.link> )
src.sysmessage The players are in the same guild.
endif
• Проверяем находится ли игрок вообще в гильдии:
if ( <src.memoryfindtype.memory_guild.uid> ) // This is 0 if the item doesn't exist
src.sysmessage The player is in a guild
endif
• Проверяем, находится ли, игрок в специфической гильдии (игрок - SRC, guildstone - дефаултный объект):
if ( <src.memoryfindtype.memory_guild.link> == <uid> )
src.sysmessage You are in this guild!
endif
WAR MEMORIES – они используются, чтобы автоматически атаковать врагов, когда вы находитесь рядом и также прибавлять килы игракам  . Имеется одна память типа MEMORY_FIGHT для каждого персонажа, кто напал и ударил рассматриваемого персонажа. Это может использоваться, чтобы предотвратить накопление, убийств для некоторых людей, или это можно использовать, чтобы назначить опыт нападавшим существам. Есть скрипт, который я написал, чтобы предотвратить баг Сферы, где человек может возродиться(реснуться) и затем позвать гвардов чтобы убить убийцу несколькими часами позже.

Код
[FUNCTION REM_COMBAT_MEMS] 
IF ( <MEMORYFINDTYPE.MEMORY_WAR_TARG.UID>) || (<MEMORYFINDTYPE.MEMORY_SAWCRIME.UID>) || (<MEMORYFINDTYPE.MEMORY_FIGHT.UID>)
IF (<MEMORYFINDTYPE.memory_fight.LINK.MEMORYFINDTYPE.me  mory_fight.LINK> == <UID>)
MEMORYFINDTYPE.memory_fight.LINK.MEMORYFINDTYPE.me  mory_fight.REMOVE
ENDIF
MEMORYFINDTYPE.MEMORY_WAR_TARG.REMOVE
MEMORYFINDTYPE.MEMORY_FIGHT.REMOVE
MEMORYFINDTYPE.MEMORY_SAWCRIME.REMOVE
REM_COMBAT_MEMS
ENDIF
RETURN 1


by Aqua







ВЕСЕЛЬЕ С ЧИСЛАМИ

Первое что вы заметите просматривая скрипты Сферы это широкое разнообразие способов использования чисел. Так как числа исключительно важны для скриптера Сферы, этот урок посвящен именно им. К концу урока я надеюсь у вас сложится общее представление о десятиричной, двоичной и шеснадцатиричной системах исчисления и о том, как Сфера работает с ними. Также вы узнаете как генерировать случайные числа из общего множества или из заданного интервала.

Первое что вы должны понять это то что способ исчисления который мы используем не является единственным. Наша система исчисления состоит из 10 знаков (0, 1, 2, 3, 4, 5, 6, 7, 8 и 9). Далее, чтобы получить следующее значение мы должны добавить еще одну колонку слева и обнулить текущую (... 8, 9, 10). Именно так работает наша система исчисления.

В десятиричной системе, даже не подозревая об этом, мы используем цифры применяя "степень десяти". Например возьмем число 17282 (которое я просто придумал) и разложим его следующим образом:

Степень десяти 4 3 2 1 0
Десять в этой степени 10000 1000 100 10 1
Значение 1 7 2 8 2

Таким образом, чтобы получить 17282, мы берем число десять в степени из верхнего ряда (10 в степени 4 = 10000, например) и умножаем это на число в нижнем ряду (10000*1). Затем просто складываем эти числа. получается 10000+7000+200+80+2=17282. Это настолько очевидно, что мы не замечаем этого. Вы наверно думаете: "И что интересно он пытается этим доказать?" Что ж, только то, что наша система исчисления не единственна.

Итак, существует еще одна система исчисления, которую используют в основном только компьютеры. Она состоит только их двух знаков (0 и 1) и поэтому называется двоичной системой. Бинарные числа выглядят следующим образом: 101011101101. Цифра в бинарной системе называется битом (bit, BInary digiT). Двоичные числа очень трудно напрямую перевести в десятичные, так как приходится проводить некоторые исчисления.

Двоичная система работает также, добавляя степень числа. И так как она двоична, то есть состоит из двух чисел, это число соответственно 2.

Степень двух Бинарное значение Десятеричное значение
0 1 1
1 10 2
2 100 4
3 1000 8
4 10000 16
5 100000 32
6 1000000 64
7 10000000 128
8 100000000 256
9 1000000000 512
10 10000000000 1024

Эти двоичные числа выглядят очень знакомо. На первый взгляд кажется, что это тоже степени числа десять. Но как вы видите из правой колонки, они являются абсолютно разными. Уверен вы уже начинаете понимать проблему. Вы хотите складывать такие значения переводя значения в разные системы? У вас получится что-то типа: 278 в бинарном виде равно 100010110. Вот еще пример:

Бинарное значение Десятичное значение
101 5
111 7
1111 15
10101110 174
101110111101101011 192363

Забавно, да? (IMG:style_emoticons/default/smile.gif)

Нам нужна система получше! Причина, по которой у нас получаются такие странные числа в том, что 10 не является двум в какой-нибудь степени. Нам нужно найти систему в которой базовое число является двум в какой-нибудь степени. Наиболее часто используемая система основывается на базовом числе 16 и называется она шеснадцатеричной. Уверен, если вы читали англоязычные форумы по программированию в Сфере, то вам часто попадалось слово hex. Нет, это не проклятье математиков и не злое заклинание, это аббревиатура слова hexademical что значит "шеснадцатеричный".

Двоичное значение Десятеричное значение Шеснадцатеричное значение
1 1 1
10 2 2
11 3 3
100 4 4
101 5 5
110 6 6
111 7 7
1000 8 8
1001 9 9
1010 10 A
1011 11 B
1100 12 C
1101 13 D
1110 14 E
1111 15 F
10000 16 10

Видите как это работает? К системе добавили еще шесть цифр, которые являются первыми буквами буржуйского алфавита.

Итак, в Сфере вам практически никогда не придется иметь дело с бинарными числами, основывающимися на двух, но если придется то вы всегда можете воспользоваться научным калькулятором чтобы вычислить нужное значение. В любом случае, куда легче работать с шеснадцатеричной системой. (Это последняя таблица, я обещаю!)

Бинарное значение Шеснадцатеричное значение
000000001 (1) 01
000000010 (2) 02
000000100 (4) 04
000001000 (8) 08
000010000 (16) 010
000100000 (32) 020
001000000 (64) 040
010000000 (128) 080
100000000 (256) 0100

Как вы видите, в шестнадцатеричной системе есть определенное правило. Вы наверное думаете, ведь 1, 2, 4 и 8 как-то связаны между собой. И вы правы. Еще вы наверное заметили что перед каждым шестнадцатеричным числом стоит нолик (0100 вместо 100). Этим ноликом вы как бы говорите Сфере: "Тут мы применяем шестнадцатеричное число, смори не напутай чего". Ведь 0100 и 100 это совершенно разные числа.

Допустим, в скрипте вы хотите установить 13й бит числа (в параметре FLAGS например). Вы можете написать:

SRC.FLAGS=<SRC.FLAGS>|8192

Но разве вы бы запомнили что 8192 это 2 в 13й степени? (почему именно в 13й? нам ведь нужен 13й бит!) Вряд ли.

Ребята из Майкрософта подарили нам очень полезное приложение которое легко конвертирует десятеричные числа (dex) в двоичные (bin) и шестнадцеричные (hex). На самом деле там есть еще одна система (oct) но так как она не используется в Сфере, мы ее не рассматриваем. Программаа называется Калькулятор.

Пуск - Программы - Стандартные - Калькулятор. Я подожду пока вы его откроете.

Готово? вот теперь откройте меню Вид и поставьте Инженерный. Ого как изменилось окошко! Итак чтобы конвертировать число из десятичной системы в шеснадцатеричную, просто наберите его (8192) в одной системе (dex) и тыкнете на флажок другой системы (hex). Припишите спереди нолик и Сфера с аппетитом скушает такое число.

Это была, пожалуй, самая трудная часть изучения написания скриптов Сферы. В следующем параграфе вам не придется иметь дела с ужасными числами. Кстати если вы вытерпели весь этот параграф, то это добрый знак того что вы станете хорошим скриптером!

Итак вперед к скриптам!







DEFNAMES
или как избежать ужасных чисел

Вот список ужасных чисел с которыми вам вероятно придется встретиться при написании скриптов:

Ужасное число Что оно значит
0eed ID золотой монеты
0dda ID красного moongate
1650 1400 Координаты Британии
021 Код красного цвета
04000 Невидимый цвет
04000efad Серийный номер предмета
4 Уровень привелегий ГМа
2048 (or 0800) FLAG заклинания Инкогнито
010 (or 16) Тип памяти агрессоров

Понятно, что никто не хочет запоминать все эти числа. Давно в прошлом еще до SPHERE и TUS (SPHERE до .50 версии) во времена Grayworld (TUS до .41 версии) нам приходилось запоминать все эти числа. Я знаю наизусть все из них (кроме серийного номера, его я просто придумал) и еще наверно пару десятков подобных чисел. Тем, кто не желает сидеть и учить наизусть эти числа, очень свезло. SPHERE разработала систему, в которой предметы могут быть идентифицированы именами, а не цифрами.

На самом деле, предметы все так же определяются числами. Просто теперь числа определяются именами.

Напишите .add 0eed в игре и нажмите Enter. Появится прицел и вы создадите одну монетку золота.

Теперь напишите .add i_gold и нажмите Enter. Вы создадите точно такую же монету.

Скажите, что легче запомнить, 0eed или i_gold? Я думаю i_gold выигрывает с большим отрывом. Но как получается это колдунство? Давайте заглянем в файл определений и найдем там золотую монету. Вы можете найти это в sphereresources.scp.

Код
[ITEMDEF 0eed]
//gold coin
DEFNAME=i_gold
TYPE=T_GOLD
VALUE=1
CATEGORY=Provisions - Miscellaneous
SUBSECTION=Coins
DESCRIPTION=Gold Coin
DUPELIST=0eee,0eef


Я выделил красным строку которая нам нужна для данного урока. Заметьте также 0eed в самом верху скрипта. 0eed это настоящий номер предмета. В следующем параграфе мы более детально рассмотрим номера предметов.

Сейчас же мы хотим рассмотреть строку DEFNAME=i_gold. Вот так скрипт говорит SPHERE "Хочу чтобы предмет 0eed назывался i_gold". Если вы попытаетесь обратиться к i_gold до того как SPHERE прочтет этот скрипт (больше о порядке чтения скриптов вы узнаете в Главе 2), сервер выплюнет ошибку, но сейчас он знает что к чему, так что вы можете смело использовать это в игре или в другом скрипте.

Всегда давайте своим предметам понятные и легкие DEFNAME (не какое-нибудь zolotaya_labuda для викинг сворда из золота). Так вам будет проще вспомнить DEFNAME.

Еще один способ дать определение предмету - использовать таг [DEFNAME] в скрипте. вот например:

Код
[DEFNAME colors]
color_blue    02
color_red     021
color_green   041


Вы можете найти такой скрипт в файле spheredefs.scp, еще один файл который должен быть загружен перед остальными скриптами.

Вот объяснение скрипта, строка за строкой:

Строка 1: Тут определяется тип скрипта и DEFNAME (да, COLORS это DEFNAME этого скрипта). Эта строка говорит серверу какого рода скрипт прописан между ней и следующим идентификатором (идентификаторы это строки, заключенные в квадратные скобки). Все идентификаторы имеют свой формат. Первый параметр это тип скрипта. Их великое множество, я буду рассказывать о них по мере того как мы с ними будем сталкиваться. Второй пареметр это либо ID либо DEFNAME. В большинстве случаев написания вами скриптов это будет DEFNAME.

Строки 2-4: Устанавливают ваши личные DEFNAMES. Они говорят, что color_blue является 02, color_red является 021, а color_green соответственно 041. Все определения, хранящиеся в этом файле будут крайне важны для вас, так как вам не придется запоминать все те ужасные числа с которыми мы столкнулись в предыдущем параграфе. Он включает в себя определения таких вещей как Флаги (FLAGS), названия атрибутов предметов, встроенной midi музыки, типов памяти и многих-многих других штуковин. Посмотрите файл, там много интересного.

Вот и все что я хотел рассказать о DEFNAMEs. Вы еще не раз вернетесь к этому и еще кое-что узнаете по мере того как мы будем изучать другие виды скриптов.

Теперь давайте продолжим изучать предметы.







ITEMDEF
или как сделать из мухи слона. В стиле SPHERE.

Большинство людей создают скрипты предметов куда сложнее чем они могли бы быть. Следуя задачам этого параграфа, и так как более сложные скрипты все еще ждут нас впереди, я расскажу вам о том как написать простой скрипт предмета, строка за строкой. Мы используем все тот же скрипт золотой монеты из предыдущих параграфов, чтобы было понятнее.

Ах... и так вот он! Весь в цветах для вашего удовольствия!

Код
[ITEMDEF 0eed]
//gold coin
DEFNAME=i_gold
TYPE=T_GOLD
VALUE=1
CATEGORY=Provisions - Miscellaneous
SUBSECTION=Coins
DESCRIPTION=Gold Coin
DUPELIST=0eee,0eef


Это самый простой из скриптов предметов, так как у этого предмета нет никаких действий кроме как существования. Я пройдусь по нему строка за строкой, поясняя что каждая из них делает и как влияет на конечный результат.

Строка 1 [ITEMDEF 0eed]

Первые строки скрипта обычно являются самыми важными. В общем, это строка говорит серверу: "Слышь, это предмет и он называется 0eed". Затем сервер шустро просматривает один из клиентских файлов (обычно это art.idx) и определяет является ли это предмет одним из встроенных. Я думаю все предметы примерно до 04500 определены как встроенные, таким образом не стоит определять свои предметы в этом промежутке. Написав эту строку вы говорите серверу что за ней следует скрипт предмета. Вы также определяете 0eed как действительный предмет, что очень вам поможет в дальнейшем когда вы захотите дать немного золота своим игрокам!

Строка 2: // gold coin

Это версия комментариев SPHERE. Программисты языка С мгновенно узнают такой формат. Если вы напишите // в любой строке скрипта, SPHERE будет игнорировать все что находится за этим символом. Вы можете поставить это в начале строки (тогда SPHERE пропустит всю эту строку) или в конце чтобы например описать что именно вы делаете этой строкой. Это никак не влияет на программу, так что можете пользоваться этим как хотите.

Строка 3: DEFNAME=i_gold

Теперь вы уже должны знать что это такое! Если нет, лучше вернитесь к предыдущему параграфу и прочитайте его заново. Эта строка говорит серверу что i_gold и 0eed одно и то же. Во всех скриптах предметов все параметры приобретают вид:

переменная=значение

В дальнейшем вы поймете что этот формат важен для вас больше чем вы можете представить. Предметы имеют кучу переменных, включая:

DEFNAME
ID
TYPE
VALUE
RESOURCES
Остальные переменные зависят от типа предмета, что ведет нас прямо к...

Строка 4: TYPE=t_gold

Первое что вы можете подумать, наверное: "что это за t_gold еще?" Ну... это DEFNAME ... На самом деле это число. и оно равно 72. Если хотите проверить, посмотрите в spheredefs.scp. Написав TYPE=72 вы бы вызвали тот же самый эффект.

На сегодняшний день существует 183 встроенных типа предметов. Это прошитые в SPHERE типы предметов которые определяют их действия. Если у предмета не задан тип, при двойном тыке на него вы увидите "You can't think of a way to use that item". Чтобы посмотреть весь список типов, загляните в spheredefs.scp. На данный момент вам следует знать что установив тип предмета t_gold вы просто заставите его вести себя как золотую монету (тоесть вы сможете купить на него что-нибудь!) Установив этот тип на какой-нибудь другой предмет вы возможно убедите SPHERE что и на него вы можете что-нибудь купить. Я этого никогда не делал. Наверно интересно иметь у себя на шарде собственную валюту...

Строка 5: VALUE=1

Эта строка опрделяет сколько стоит предмет при покупке, в золотом эквиваленте. У нас это золотая монета, которая стоит, как ни странно, одну золотую монету.

Строки 6-8: CATEGORY, SUBSECTION, DESCRIPTION

Эти строки используются только ГМовской программой, Осью (Axis) которая избавляет вас от геморроя печатать ".add i_gold" На самом деле она печатает ".add 01737" и подобные вещи для предметов которые не настолько важны чтобы давать им свои собственные DEFNAMEs.

Строка 9: DUPEITEM

Для разработчиков сферы было бы большим гемором прописывать все 8000 предметов отдельно, учитывая что большинство из них, по сути, те же самые. Наверное видели что если брать с пола и ставить на пол какой-нибудь кусок забора, то он меняет свою форму? Вот каждая из этих форм - это отдельный предмет, а по сути одно и тоже. Числа, описанные в этой строке являются предметами, которые не были определены. Вот скрипт предмета 0eee:

Код
[ITEMDEF 0eee]
//gold coins
DUPEITEM=0eed
CATEGORY=Provisions - Miscellaneous
SUBSECTION=Coins
DESCRIPTION=Gold Coins


Как вы видите, тут прописан только один параметр. DUPEITEM заставляет сервер найти и прочесть информацию о 0eed (или i_gold) , такую как TYPE или VALUE и применить ее к этому предмету. DUPEITEM служит только для сохранения времени. Вы вряд ли будете этим пользоваться.







CHARDEF
или как создать голого чувака который будет стоять и говорить "Huh?"

NPC.. (Non-Player Characters) они вращают миром. Они это то, что делает Ультиму уникальной многопользовательской игрой. Монстры и вендоры которых вы создаете делают ваш шард уникальным. Этот параграф посвящен тому, как создать чувака который будет стоять и говорить "Huh?" (или "Stop thief!" если пожелаете!).

Прежде всего, давайте взглянем на скрипт простого голого человека. Я выдернул его из spherechar_human.scp.

Код
[CHARDEF 0190] 
DEFNAME=c_man
Name=Man
ICON=i_pet_MAN
CAN=MT_EQUIP|MT_WALK|MT_RUN|MT_USEHANDS
RESOURCES=i_flesh_head, i_flesh_torso, i_flesh_right_arm, i_flesh_left_arm
FOODTYPE=15 t_food, t_fruit
DESIRES=i_gold,e_notoriety
AVERSIONS=t_TRAP,t_eerie_stuff
SHELTER=r_house
BLOODCOLOR=0

TSPEECH=spk_human_prime
TSPEECH=spk_human_default
TEVENTS=e_Human_HearUnk
DESCRIPTION=Man
SUBSECTION=Miscellaneous
CATEGORY=Civilized


Как видите, этот скрипт не особо отличается от скриптов, которые мы изучили ранее. Тут много тех же самых переменных, включая DEFNAME, DESCRIPTION и других переменных Аксиса.

Но тут так же и много новых вещей которые мы сейчас изучим, одна за другой! Let the good times roll! (Простите если вы не Американец.. Все мои американские приколы наверно вас уже достали!)

Строка 1: [CHARDEF 0190]

Сюрприз! Это идентификатор, которое говорит серверу что все нижеследующее вплоть до следующего [идентификатора] является описанием персонажа. Также эта строка определяет, что ID нашего персонажа будет 0190. Это кстати встроенный ID голого человека. Вы уже наверное знаете что 0190 в шеснадцатеричной системе исчисления равно 400, ведь так? Разве нет? Да ладно, я просто прикалываюсь, вам нет необходимости это знать =).

Строка 2: DEFNAME=c_man

Тут ничего нового. c_man это тоже самое что и 0190. Заметьте, большинство DEFNAME'ов персонажей начинаются с буквы "с" (character, персонаж)

Строка 3: Name=Man

Опа! Тут что-то новенькое! Предметы имеют установленные названия, вшитие в сервер. Персонажи нет. Таким образом нам необходимо присвоить ему имя. Мы можем дать ему любое имя, но так как это всего лишь пример, пусть он будет называться "Man".

Строка 4: ICON=i_pet_man

Я не сразу смог разобраться, что это такое. ICON определяет какой картинкой будет отображаться этот персонаж если кто-нибудь использует скилл Слежение (Tracking). Эти картинки на самом деле являются предметами (предметами i_pet). Чтобы узнать предмет i_pet для своего создания сотворите его в игре при помощи .addnpc, а потом используйте на него команду .shrink . ID получившегося предмета будет i_pet предметом вашего создания.

Строка 5: CAN=mt_*

(символ "*" означает "все что угодно", на тот случай если вы еще этого не знаете)

Это одна из самых важных строк вашего скрипта персонажа (наряду с ID который мы присваиваем ему в самом начале). Она позволяет установить что наш персонаж может и чего не может делать. Всего существует несколько предметов mt_*, и все они прописаны в файле spheredefs.scp. Ниже я привожу их список с объяснениями некоторых из них:

MT_NONMOVER 0 // Не может двигаться
MT_GHOST 01 // Может проходить сквозь, например, двери, ну прям как призрак
MT_SWIM 02 // Может плавать (Как Водяные Элементали, Дельфины, и т.п.)
MT_WALK 04 // Может двигаться. Установите это вашему персонажу чтобы он мог ходить
MT_FLY 010 // Может ходить сквозь деревья (хотя должен "над" ними по идее)
MT_FIRE_IMMUNE 020 // Имеет иммунитет к огню. Не ставьте это игрокам =)
MT_EQUIP 00100 // Может одевать вещи (и брать в руки, в общем "экипероваться")
MT_USEHANDS 00200 // Может использовать руки чтобы носить предметы или открывать двери
MT_MALE 0 // Мужчина
MT_FEMALE 00800 // Жещина
MT_NONHUM 01000 // Не человек. Я не уверен что это дает
MT_RUN 02000 // Может бегать

В соответствии с этим списком получается, что если мы не установим CAN флаг нашему персонажу то он будет неподвижным и будет мужчиной (оба нули). Из примера вы видите что используя символ " | " между флагами, мы можем установить несколько таких флагов. В данном случае мы позволяем персонажу одевать вещи, ходить, бегать и использовать руки. (Интересным фактом является то что если даже у создания нет рук мы все равно можем позволить ему их использовать, например чтобы носить источники света. Огненнные элементали именно так и устроены, именно таким образом они светятся)

Строка 6: RESOURCES

Эта строка кажется немного странной для описания персонажа, особенно человека. Тут указаны предметы которые можно получить разрезав его труп. Жутко, да? (IMG:style_emoticons/default/wink.gif)

Строки 7-10: FOODTYPE, SHELTER, DESIRES, AVERSIONS

Я не уверен имеют ли эти параметры хоть какое-нибудь значение в игре. Я видел NPC которые ходят и клянчат денюжку, потому что так проставлено в его DESIRES, вот и все.

Строка 11: BLOODCOLOR

Хотели когда-нибудь чтобы у вашего игрока была зеленая кровь? Как раз тут вы можете это прописать. Можете использовать либо номер либо DEFNAME цвета. (Кстати очень удобно знать номера обычных цветов наизусть, поверьте мне)

Остальные: TSPEECH and TEVENTS

Это мы рассмотрим в отдельных параграфах. Они являются, пожалуй одними из самых сложных вещей в написании скриптов. (Сколько можно ссылаться на будущее и говорить что это сложно? (IMG:style_emoticons/default/wink.gif))







TEMPLATE
или как засунуть кучу предметов в отдельный мешочек.

Многие из вас сталкивались с этим: убиваешь, скажем, дракона, а в его теле вместо аккуратно расфасованных пакетиков находишь 80 раскиданных бутылок. А магическое оружие или амулет погребены где-то под ними!

Как разрешить эту проблему? Что ж, SPHERE дала нам очень полезный инструмент TEMPLATE. Он позволяет вам определять одновременно контейнер и предметы, находящиеся в нем. Ну, разве не здорово? Вот, я также подумал когда впервые узнал об этом. Давайте сейчас, как всегда, разберем по частям какой-нибудь скрипт. Вот например это я выдернул из spheretemp_loot.scp.

Код
[TEMPLATE 101505]
DEFNAME=backpack_poor
CATEGORY=Item Templates
SUBSECTION=Loot Templates
DESCRIPTION=Poor Backpack
CONTAINER=i_backpack
ITEM={ random_food 1 0 3 },{ 1 3 }
ITEM={ random_bottle 1 0 8 }
ITEM={ random_light 1 0 8 }
ITEM={ random_male_tops 1 0 4 }
COLOR=colors_all
ITEM={ random_male_pants 1 0 4 }
COLOR=colors_all
ITEM=POOR_GOLD_PILE


Ого! Вроде ничего не понятно... но, поверьте, к тому времени, как мы закончим, вы будете знать об этом абсолютно все!

[TEMPLATE 101505]
Во-первых, давайте взглянем на заголовок скрипта. Интересным фактом касательно скриптов является то, что названием предмета не может быть DEFNAME, тут применимо только огромное глупое число типа 101505.

DEFNAME=backpack_poor
Естественно, разработчики SPHERE не такие уж садисты, они дали нам возможность дать этому огромному числу DEFNAME для удобного доступа к нему. Скажите, что бы вы предпочли напечатать: ".add 101505" или ".add backpack_poor"? ... Я так и думал.

CATEGORY, SUBSECTION, DESCRIPTION
Аксис'овская херь. В скрипте не обязательна. В предыдущих параграфах об этом уже шла речь.

CONTAINER=i_backpack
Ага.. вот мы и подбираемся к самой сути. Тут указывается контейнер, в котором будут находиться все остальные предметы. В данном случае это пак (рюкзак этакий). Тут может быть применен любой предмет, TYPE которого является t_container или t_container_locked.

ITEM={ random_food 1 0 3},{1 3}
Мда.. вот это трудно понять. Я думаю стоит рассмотреть эту строку подробнее.

Но сначала мы узнаем что такое случайные операторы. Странное словосочетание? Возможно, но это абсолютно необходимая вещь для хорошего шарда.

На самом деле это очень хороший способ получить разные числа используя одну команду. Каково было бы играть на шарде где каждый раз убив дракона вы бы получали "Заколдованные доспехи блатной непробиваемости" и "Супер Меч Мегасилы"? Да все бы бегали с такими! Тут не обойтись без вероятности.

Существует два вида случайных операторов: взвешанное случайное и ранжированное случайное. Взвешанное случайное гласит: "Так, вероятность выбора числа А равняется 1 из 10, числа В - 3 из 10 и числа С - 6 из 10", а ранжированное случайное в свою очередь: "Выбор любого числа из заданного интервала"

В нашем примере мы видим применение и взвешанного и ранжированного случайного. Давайте рассмотрим их в том порядке в котором они следуют:

{ random_food 1 0 3}

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

random_food 1
0 3

Теперь сложите правые числа в каждой строке чтобы получить 4. SPHERE воспринимает это следующим образом: "Итак, с вероятностью 1 из 4 выпадает random_food а с вероятностью 3 из 4 выпадает ноль. На самом деле случайный оператор может даже стать частью другого случайного оператора, но в таких конструкциях легко запутаться.

{ { random_food 1 0 3} 1 random_clothing 1}

Ну что слабо разобраться?

random_clothing 1
{ random_food 1 0 3} 1

В этом примере волшебным числом является двойка. С вероятностью 1 из 2 SPHERE выберет random_clothing и с той же вероятностью (1 из 2) она запустит наш предыдущий оператор, который в свою очередь согласно своим условиям даст соответствующий результат. Если вы запутались, не переживайте, эти операторы применяются достаточно редко, и через минуту мы посмотрим, как Templates помогает нам решить эти проблемы.

На самом деле я упоминал два вида операторов, помните? И наверно вы уже догадались что второй выглядит вот так:

{1 3}

ВНИМАНИЕ: Расстановка пробелов играет важную роль. Между первой фигурной скобкой и первым числом а так же между второй фигурной скобкой и вторым числом не должно быть пробелов, иначе SPHERE будет очень странно себя вести.

Эта строка гласит: "Выбрать число между 1 и 3, включительно". Включительно означает, что SPHERE может выбрать 1, 3 или любое другое значение между ними. В данном примере выбор довольно-таки ограничен. SPHERE выберет только 1, 2 или 3. Вот такие ранжированные операторы в основном используются в составе взвешанных операторов.

{ {1 3} 3 {4 9} 1}

"С вероятностью 1 из 4 выпадет число в пределах от 4 до 9. С вероятностью 3 из 4 выпадет число в пределах от 1 до 3".

И, закончив на этом с теорией, давайте посмотрим что же делает вся эта строка в SPHERE.

Часть строки Что она делает
ITEM= Это гласит: "Итак, нужно добавить предмет в этот контейнер". Все что стоит после знака "=" определяет что именно мы положим в мешок и в каком количестве. На самом деле можно просто написать ITEM=i_platemail_chest, или что-нибудь другое в этом духе, без этих загадочных фигурных скобок, но Templates тем и отличаются, что тут мы можем варьировать по нашему усмотрению.
{ random_food 1 0 3} Это предмет который мы будем создавать. Как мы помним из теории о взвешанных случайных операторах, с вероятностью 1 из 4 это будет random_food, а с вероятностью 3 из 4 это будет ноль. Если ITEM'ом является ноль, то на самом деле SPHERE просто не создаст никакого предмета. Проще говоря, "С вероятностью 1 из 4 в этом контейнере появится random_food". Вы спросите что такое random_food? Ну, я так думаю, это еще один Template, описанный в spheretemplate.scp.
{1 3} Это количество предмета который будет создан. Вы наверно уже поняли что это ранжированный случайный оператор. Он говорит SPHERE положить от 1 до 3 предметов в контейнер. Конечно, если предметом выпадет ноль, этот оператор не даст никакого эффекта, ведь "одно ничего" и "три ничего" так или иначе остаются этим самым "ничего".

Что ж, вот так и выглядит Template скрипт. Просто наполните его нужным количеством нужных вам предметов. Вы так же можете заметить следующую конструкцию:

ITEM=i_sword_long,R11

Это сокращенный вид следующей строки:

ITEM={ i_sword_long 1 0 10 }

R11 означает что шанс выпадения этого предмета является 1 из 11. А в конце вы можете добавить еще один оператор, и тогда строка станет еще страшнее:

ITEM=i_sword_long,R11,{4 5}

Но зачем вам четыре и пять мечей в одном мешке? (IMG:style_emoticons/default/smile.gif)

Ну, вот и все касательно Templates. Поздравляю, вы закончили первую главу. Теперь, я уверен, вы сможете понять все примеры которые приведены в следующем параграфе.

(Belgar только что выложил этот скрипт на форуме, говорит что он должен работать без ошибок. Используйте его как пример.)
[template tm_necromancer]
container=i_bag
item=random_necro_scroll
item=random_necro_scroll
item=random_necro_reagent, {5 12}
item=random_reagent, {5 12}
item=random_necro_reagent, {5 12}

ПРИМЕРЫ
или.. м-м-м.. пожалуй слово "ПРИМЕРЫ" по-другому не скажешь...

В этом параграфе я покажу как создавать самые простые предметы. Явный акцент будет уделяться "ON=@Create", так как это является основной темой Главы 2. Пока достаточно знать что все, что вы можете менять в игре (цвет и т.д.) должно стоять после строки ON=@Create.

Пример 1: A Red Sword

Код
[ITEMDEF i_sword_red]
ID=i_sword_viking
TYPE=t_weapon_sword
NAME=The Red Sword
CATEGORY=Weapons
SUBSECTION=New Swords
DESCRIPTION=Red Sword

ON=@Create
COLOR=colors_red    // Это комментарий. SPHERE их игнорирует.


Постойте, погодите… а что такое эти "//"? Это называется комментарий. Он просто игнорируется SPHERE'ой, так что можете писать все что угодно в конце строки после символа "//". Вы не сможете создавать многострочные комментарии, если только не будете ставить "//" каждый раз в начале строки. Так что даже не думайте. SPHERE выдаст вам кучу забавных ошибок и вы устанете искать их.

ПРимер 2: A blue ettin

Код
[CHARDEF c_ettin_blue]
ID=02                // Здесь также можно использовать c_ettin.
NAME=My Blue Ettin

ON=@Create
COLOR=02        // Это темно-синий цвет. Было бы полезным запомнить это.


Пример 3: Template из файла, так как я слишком ленив чтобы написать свой.

Код
[TEMPLATE 101521]
DEFNAME=goodie_meager_1
CATEGORY=Item Templates
SUBSECTION=Loot Templates
DESCRIPTION=Meager Goodie 1
ITEM={ meager_gold_pile 1 backpack_meager 1 pouch_meager 1 }
ITEM={ random_boots 1 0 4 }
ITEM={ random_gorget 1 0 4 }
ITEM={ random_staff 1 0 4 }
ITEM={ random_necklace 1 0 4 }
ITEM={ i_cape 1 0 9 }
COLOR=colors_all


Здесь вы можете найти кое-что новое (даже хотя бы потому что я выделил это красным), и да, там все правильно написано. Все строки между строками ITEM= будут влиять на только что созданный предмет. Строка COLOR= относится к предмету, созданному строкой

ITEM={ i_cape 1 0 9 }

Запомните, чтобы научиться хорошо писать такого рода скрипты, почитайте файлы sphereitem_colorarm.scp и sphereitem_beers.scp.







SPHERETABLES.SCP
Или как сделать чтобы новые игроки появлялись где-нибудь в Serpent's Hold.

Spheretables.scp - это самый первый файл который читает SPHERE после SPHERE.ini и поэтому он самый важный. Практически все внутренние работы игры хранятся в этом файле, а также в его дубликате, spheretable_x.scp. Откройте сейчас оба файла чтобы вы могли следить за текстом. Сначала взглянем на spheretables.scp.

Первое что вы увидите открыв этот файл – это список ресурсов. Он отмечен (СЮРПРИЗ!) тагом [RESOURCE]. Выглядит это примерно так:

Код
[RESOURCES]
// sphere.ini and spheretable.scp are automatic.
// All the other scripts we want to load.
spherebook.scp
sphereevents.scp
spheredefs.scp
spheredialog.scp
spherehelp.scp
sphereresources.scp
sphereitemb1.scp
sphereitemb2.scp
sphereitemb3.scp
sphereitemb4.scp
sphereitemb5.scp


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


--------------------
С уважением Администратор Форума.
Контактный Email: dihlofozzz@uokit.com


Topic Closed
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

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