Указатели (Pointers)
Содержание:1. Что такое поинтеры 2. Основные
указатели: SRC, ACT, CONT; Соединитель LINK 3. Указатели:
TARG и TOPOBJ 4. Операторы FINDID, FINDTYPE,
FINDLAYER 5. Итог
1. Что такое поинтерыPointers - от англ. -
"указатели" (некоторые называют их "поинтами" - от англ. слова
to point - "указывать"). Поинтеры - это ключевые слова,
определенные в Sphere, без которых скриптинг немыслим и
которые осуществляют обращение к различным объектам (под
объектами понимаются как чары, так и предметы). Обращение -
это вид связи между объектом, оказавшимся под некоторым
действием и тем, кто произвел это дейсвие. Как правило, это
одностороннее обращение, но можно создать и двустороннее.
2. Основные указатели: SRC, ACT, CONT; Соединитель
LINKОдностороннее обращение:
[ITEMDEF
i_gold_giver] ID=i_gravestone NAME=Gold giver
On=@Dclick SRC.NEWITEM=i_gold SRC.ACT.AMOUNT=500 SRC.ACT.BOUNCE RETURN
1
Где SRC представляет собой обращение к
объекту, который 2 раза кликнул на грейвстон. В данном случае,
если два раза кликнул чар, то связь образуется между чаром и
кликнутым объектом. Связь проходит от кликнутого объекта к
чару, и все скриптовые действия связанные с SRC будут
осуществляться только над чаром.
Далее следует ACT (от англ. Action - действие), не просто
действие, а обращение к объекту над которым было произведено
последнее действие. В данном случае этот объект - итем i_gold.
Совершено действие по изготовлению i_gold, и оно является
последним по отношении к чару. Поэтому создается еще одна
связь, между i_gold и чаром. И последней стадией в этом
скрипте является указание amount (количества). И bounce
(положить в бекпак). Return 1 - остановить действие на данном
моменте. Связь создается только на 1 мгновение последующей
команды и в следующей строке надо описывать еще раз стадию
связи.
Нельзя писать так:
SRC.NEWITEM=i_gold ACT.AMOUNT // SRC отсутствует ACT.BOUNCE // SRC отсутствует RETURN 1
Так как связь создана на первом моменте и
на первом она прерывается. Конечно это не означает, что
невозможно сочетание просто act.amount, но в данном случаи оно
неуместно.
Еще один пример одностороннего обращения:
[ITEMDEF
i_alchemical_giver_death] ID=0181d NAME=AutoKiller
On=@STEP IF !
(0==1) SRC.TAG.GIVEDEATH=1 SRC.NEWITEM=i_giver_death SRC.ACT.TYPE=t_eq_script SRC.ACT.TIMER=1 SRC.ACT.LINK=<UID> SRC.ACT.EQUIP RETURN
1 ENDIF
[ITEMDEF i_giver_death] ID=i_gold NAME=Death giver
On=@TIMER CONT.HITS=0 LINK.SAY You will never step on
me! CONT.TAG.GIVEDEATH= REMOVE RETURN 1
В этом скрипте обращение идет к чару,
который наступил на символ. Создается итем и вешается на него
с таймером равным одной секунде. А на итеме пишем если таймер
достигнет 0, то CONT.HITS=0 , значит чар умирает если он не
invul. В таймерах команды всегда CONT. Так как SRC. он не
воспримет и смысла в нем не будет.
CONT (от англ. to contain - "содержать") - это обращение к
объекту, которому принадлежит этот предмет. В данном случаи
этот объект "Чар", который наступил на символ и получил
монетку с таймером 1, и "в котором" лежит эта монетка. Дальше
отдана команда сказать "Ты никогда больше не наступишь на
меня!". Здесь уже не CONT, а LINK.SAY потому, что ранее я
указал, что LINK=<UID>, что значит, что значение LINK
равно серийному номеру (или, если быть точным, уникальному
номеру) предмета на который наступил чар. Далее идет обращение
обратно к предмету на который я наступил - казалось, что тут
происходит двусторонне обращение, но нет - это не так, т.к.
обращался не скриптер, а непосредственно сам итем
i_giver_death.
LINK (от англ. to link - соединять) - это еще одно ключевое
слово, которое можно использовать непосредственно в качестве
указателя.
В предметах, помимо линка присутствуют еще разные параметры
(например: MORE, MORE2). Но главное отличие их от линка, то,
что используя их нельзя производить действия над нужным
предметом. Например нельзя указав MORE2=<UID> сказать
MORE2.SAY You will never step on me!. Сфера просто не поймет.
LINK - это указатель на уникальный предмет. Изначально LINK
= 04FFFFFFF
Например:
ON=@EQUIP IF
(<LINK>==04FFFFFFF) BOUNCE RETURN
1 ELSE RETURN 0 ENDIF
В этом скрипте не присутствует команд SRC и
ACT т.к. они здесь не нужны, итем уже создан и команда Bounce
посылается самому себе. Т.е. как если мы себе пишем (.HITS
300), (.GM), (.ALLSKILLS) и т.д.
Так все же, что такое двустороннее обращение? Когда объект
обращается к предмету и наоборот, предмет выполняет действия
порученные объектом. Они могут быть как сложными, так и
простыми, но оба содержат информацию о связи друг с другом.
Двустороннее:
ITEMDEF
i_rock_to_move] ID=01365 NAME=Link checker
On=@DCLICK LINK=<SRC.UID> TARGETG RETURN 1
ON=@TARGON_GROUND P=<SRC.TARGP> LINK.SAY Ooo
it's good i did it! LINK.SALUTE RETURN 1
Вот пример простого двустороннего
обращения. Чар два раза кликнет на камень, LINK записывает UID
чара, а камень вызывает цель. Здесь нет SRC т.к. не чар
вызывает цель, а сам камень и он уже предлагает чару применить
цель. Здесь связь наблюдается только между целью и чаром. Если
чар укажет на землю, то P координата положения камня меняется
на тот P, что указал чар, т.е. опять связь между чаром и
камнем. Далее камень принуждает чара сказать "Ооо хорошо я
сделал это!" и выполнить команду (.Salute)
UID - как уже говорил это уникальный номер того предмета
или объекта, на который мы указываем.
Но, кроме того, UID можно использовать как часть поинтера и
указать на нужный нам объект.
Пример:
ON=@SPELLCAST // При касте используется функция .cast с
аргументом - номером заклинания IF
(<argn>==34) // && -
логический оператор IF !
(<UID>==<ACT.LINK>) &&
(<ACT.BASEID>==i_fx_energy_field) Message
You are never dispel this RETURN
1 ELSE RETURN
0 ENDIF ENDIF
Тут сказано если применяется заклинание
Dispel Field на Energy Field и LINK равен уникальному номеру
аккаунта проделывающего это действие , то произойдет чудо и
Energy Field пропадет.
On=@Spellcast - как правило, в spheretables.scp ставят,
поэтому не пишут (Src.argn и src.uid) так как действие уже
подразумевает, что выполняет Чар.
Кроме этого UID может указать на переменные чара или итема.
Можно написать пример:
UID.04000f3c.NAME=Connected
где UID указывает интерпретатору, что
следует обратится к серийнику 04000f3c, а далее обратиться к
переменной NAME, и присвоить этой переменной значение
"Connected". Можно также написать следующим образом:
<создаем
предмет> Src.act.LINK=<UID>
ON=@DCLICK LINK.NAME=Connected
3. Указатели: TARG и TOPOBJСейчас я хочу рассказать о
поинтерах TARG и TOPOBJ.
Targ - это указатель последней цели. Соответственно
указатель TARG указывает на объект, который был выбран
(имеется ввиду выбран специальном курсором "выбрать цель" -
курсором в виде прицела).
TopOBJ - это обращение к объекту содержащему данный
предмет. Если, например, этот предмет лежит в бекпаке чара, то
обращение будет к чару. Если в бекпаке, который лежит в
бекпака чара, то обращение все равно будет к чару.
Если в сундуке, в коробке, то обращение к сундуку. Т.е.
обращение происходит к объекту содержащему итем.
Вот приведу пример:
[ITEMDEF
i_remover_magic] NAME=Remover DEFNAME=i_remover_magic ID=i_wand_1 TYPE=T_wand
CATEGORY=Weartog
Special SUBSECTION=Wands DESCRIPTION=Remover
ON=@Create ATTR=attr_magic | attr_invis COLOR=0423
ON=@CLICK Message=~Магический Удалитель(Инвиз) RETURN
1
ON=@DCLICK SRC.SAY=~Эй, ! Кого в
этот SRC.SAY=~раз ты собераешся
удалить? TARGET RETURN 1
ON=@TARGON_CHAR IF
(<SRC.TARG.NPC>) SRC.TARG.REMOVE RETURN
1 ELSE SRC.MESSAGE=~Ты не можешь удалить
чара~ Src.MESSAGE=~таким образом! RETURN 1 ENDIF
ON=@TARGON_ITEM IF
(<SRC.TARG.TOPOBJ.uid>=<SRC.UID>) SRC.MESSAGE=~Я
не удаляю вещи SRC.MESSAGE=~из своего бекпака! RETURN
1 Else SRC.TARG.REMOVE RETURN 1 ENDIF
Пример не самый трудный, поэтому я не буду
его пояснять. Попробуйте разобраться сами - это поможет вам
лучше понять изложенный материал.
4. Операторы FINDID, FINDTYPE, FINDLAYERОбращение к
этим операторам происходит так же как и к указателям - "через
точку".
С помощью этих операторов можно найти предмет у нужного нам
чара (или в нужном контейнере) и совершить над этим предметом
какое либо действие.
Например:
SRC.FINDID.i_gold.name=~Золото Src.FINDTYPE.t_gold.drop SRC.FINDLAYER(30).remove
в первом изменяем имя любого найденного
предмета у объекта относящемся к baseid=i_gold
во втором находим любой предмет типа t_gold и выбрасываем
его
в третьем обращаемся к Layer(30) и удаляем первый
попавшийся итем, находящийся в этом слое.
Название этих операторов образовано следующим образом:
FIND - от англ. to find - искать ID - от англ. IDentify
- устанавливать (каждый предмет обладает своим ID, например
i_robe) TYPE - от англ. type - тип (подробнее о типах
читайте в справочном материале) LAYER - от англ. layer -
слой (подробнее о слоях читайте в справочном материале)
5. Итог:Количество сочетаний указателей может быть
огромным и у меня просто не хватит места все варианты описать.
Поэтому руководствуясь общими положениями я решил описать все
возможные поинтеры и операторы, синтаксис обращения к которым
схож с синтаксисом обращения к поинтерам (или по крайне мере
которые я знаю, и постарался объяснить их и все с ними
связанное начинающим скриптерам). По моему мнению, чтобы
разбираться в скриптах, обязательно надо хорошо понять какие
указатели на что указывают и в каких вариантах они будут
работать, а в каких нет.
Поинтеры, указывающие непосредственно на объект:
Src - Обратится к объекту, активировавшему действие. Act
- Этот указатель обращается к объекту последнего
действия. Cont - Этот указатель уникален для итима, и
обращается к обладателю итима. Targ - Обращается к
последней цели. Topobj - Обращается к объекту содержащему
предмет (возможно в нескольких контейнерах).
Указатели, указывающие на уникальный номер объекта (UID):
Link - Указывает на уникальный UID какого либо
объекта Uid - Обращается к определённому UID
Операторы-указатели, указывающие на какой либо предмет в
"контейнере"
Findid - Этот указатель находит первый случайный итем
подобного ID Findtype - Указывает на первый случайный итем
подобного типа Findlayer - Указывает на слой или первый
предмет, найденный в этом слое
Вот в принципе и все. Удачи вам в ваших начинаниях!
[AUTOR] |
Информация взята с q1.ru |
|