Разбор скриптовых команд.
#21
Насчёт игроков.

Игрок, управляемый человеком, всегда имеет номер 0. В частности, в сетевой игре все персонажи относятся к этому игроку (хотя фактически управляются разными людьми). Остальные юниты разбиты на игроков по-разному, но с учётом того, что одному игроку должны принадлежать заведомо дружественные существа. Например, лесные ящеры и зелёные драконы в ДГ - это игрок 1, а озёрные ящеры и синий дракон - игрок 4. Я ни разу не видел, чтобы игроков было больше десяти, хотя их номера бывают и больше девяти (например, 14), но тогда меньшие номера не используются.

Самому можно установить для юнита отрицательный номер игрока или дробный, хотя дробный всё равно округляется (проверяя через getplayer). Если поставить очень большой по модулю номер (например, -1000000), то игра вылетает.

У меня вопрос: чем понятие "коллекция"
отличается от понятия "множество"?

sun

А я всё жду, чтобы ты мне объяснил то, что я понимаю неправильно.

[ 29 января 2002: Изменил: Vasya ]</p>
#22
Кое -что стало проясняться:
С помощью этих так называемых игроков устанавливается так называемая дипломатия?
Это и Сан тоже доказывает, но что первичней
отношения или обьединения под началом ИгрокаN?
Может быть назвать их руководители политических блоков? Owners? Боги? Цари? Хозяева? Лидеры?Главнокомандующие? Один вместе с другими против другого ГлавыN 0. Вопрос еще сколько их или это не принципиально?
#23
Vasya Alexy III
Что же такое Party и с чем ее едят? Я лично не понял. Как взять в партию скажем демона и таскать за собобой. У меня не получается как захожу в портал демон остается на карте черт его возьми.
AddUnnitUnderControl работает и так безовсяких партий!!!!!

[ 29 января 2002: Изменил: Nivea ]</p>
#24
Я с партиями не работал, ничего сказать не могу. Да и структуру параметров, используемых в процедурах для работы с ними, я не совсем понимаю. (Что за строка "Human Hero Hadagan", например?) Наверное, Alexy III лучше разобрался.
#25
Vasya
Human Hero Hadagan - это раздетый Зак на Хадагане с палашом.(Поле в ресурсах таблица персов Юниты). Этот Зак похож на нашего но - другой видно для того, чтобы проще было баланс считать.

Давай все-же попробуем определиться насчет определения высоты в AddUnitToServer(и подобных ей).
Такая логика:
Мы говорим о мире 3D где по координате Z ведется отсчет высот всех обьектов.
Этот параметр, в данном случае относится к объекту, а не к местности. Так как подобные параметры Х, Y отображают также местную систему координат,начинающуюся с Юго-запада карты то писать ось будет корректней, чем высоту.
А местная система координат с абсолютной системой координат может и не совпадать и к ней привязываться не стоит.
Вот и твое описание:
068 GetZ ( objUnit : object ): float
Возвращают текущие координаты x,y и z, соответственно, юнита objUnit.
Заметь- GetZ, но не GetH.

Еще ты по коллекции задал вопрос:
Коллекция -это список обьектов т е каждый элемент
имеет индекс и содержит указатель на структуру данных одного типа.
[0]-[1]-[2]...[N]
| | |
V V V
obj obj obj

Чем от множества отличается?
Множества ближе к группам ПЗ,для множества главное
содержит ли оно данный элементX или нет? По нему
быстро не пробежишься циклом от начала до конца
т к нужно пер######рать все элементы в каком-то диапазоне типа проверь есть нулевой Item? ага- а а первый а второй и т д? Больше для флагов подходит. Во множества обьекты вообще не кладут.

а у коллекции есть count
for k=0 to count-1 do
if ItemOk(Item[k]) then
ProcessItem(Item[k])
.....

Но все это не принципиально. Если тебе больше понятней множество-считай это множеством. Главный вопрос что это? Игроки? ДипОтношения? или более подходящий термин найдем?

[ 30 января 2002: Изменил: Nivea ]</p>
#26
Nivea.
Party - хрен его знает, что это. Это явно не группа, не игрок, а какая-то самостоятельная структура. Причём, видимо через
партию ведётся управление персонажем и наёмниками.
Что бы взять демона в свою партию надо делать так:
@addunittoparty(0,"merc1","Human Gipath NPC Demon F7")
@redeployparty(0)
Причём здесь большой облом вот в чём: "merc1" означает, что добавленный в партию юнит будет называться Хадор-Забияка(для "merc2" - Ная, и т.д).
Будет иметь его характеристики. Голос и реплики так же.
#27
Alexy III, Нивеа КалбасКа,Vasya.
Давайте пока не бедем разбирать эту функцию: addunittoparty. С ней все понятно.
Есть идеи по аддону и разбор именно её будет преждевременным. Я позже сообщу, что к чему.
Alexy III свяжись со мной.
#28
Vasya
Скоро...
Big Grin

Я, разделяю сторону высказанную Nivea. Выражение height выглядит сомнительно, и я сказал бы неверно. Параметры в этой функции представляют собой координаты указывающие место на карте для объекта Unit, а не для карты высоту. В этой функции явно должны быть указаны координаты ОСК, где последний параметр – это начало координаты Z в каждой измеряемой точке на поверхности карты. В 3D представлениях существует несколько различных систем координат. Мировая - МСК и относительные - ОСК. Если принять твое понятие и термин height, то получается, что относительно Мировой системы координат Unit`ом можно измерить высоту поверхности ландшафта, которая представляет Z в МСК, а это может ввести в заблуждение. Объект Unit динамически перемещаемый по карте объект, привязывать к системе координат по МСК его не разумно, так как в этом случае Объект, будет измерять высоту «над уровнем моря». Для Объекта на карте, система координат МСК и ОСК практически никогда не совпадает по координате Z.
#29
sun

Какие есть конкретные предложения по этому параметру? Как его назвать (relZ - относительное Z?) и что мне изменить в описании процедуры?

Я не понял, почему ты считаешь, что юнитом нельзя мерить высоту местности. У меня это, вроде бы, получалось.
#30
Если тебе не принципиально, то пока, пожалуйста, напиши последний параметр просто Z. Позже при детальном обсуждении всех команд затронем этот момент. В примечании обязательно выскажи свое замечание, и то, что этот параметр ты считаешь, что лучше назвать так-то.

Установи Месенгер.
#31
sun, у меня сейчас с инетом совсем плохо. В мессенгере я тебя вряд ли поймаю. Пиши на мыло.
#32
Vasya
Я написал статью в черновом варианте. Наш форум пока не созрел для обсуждения черновых статей некомпетентных вопросов и головокружительных, непроверенных гипотез. К сожалению, в основном, это сложилось из-за боязни людей быть высмеянными, и соответственно грозящим им потерей некоего рейтинга авторитетности. Я сожалею о происходящем. На закрытых, клубных форумах безошибочность высказываемых суждений в сообщениях больше вредит, нежели способствует плодотворной работе. Так как заумные сообщения превращаются в монологи, а не диалоги. В таких случаях в процесс обсуждения таких сообщений не вливаются другие участники форума. Я в виде исключения опубликую эту заумную статью. Я дал прочесть черновик некоторым людям, Они не в восторге от моего слога.
Smile
#33
Nivea

Ты считаешь, мне надо написать так: " Добавляет юнит в точку с координатами (x,y,getzvalue(x,y)+height) для нелевитирующего и (x,y,getbszvalue(x,y)+height) для левитирующего. В дальнейшем координаты юнита подчиняются закону: z=getzvalue(x,y)+height для нелевитирующего и z=getbszvalue(x,y)+height для левитирующего."? Ведь суть именно в этом.

В игре все юниты установлены на высоте 0, и GetZ(objUnit) возвращает то же, что и GetZValue(GetX(objUnit),GetY(objUnit)) (для нелевитирующего). При этом самому можно установить юнит на любой высоте. Параметр height точно может быть отрицательным, хотя ограничений на него я не знаю.

Коллекция - это список объектов. Я правильно понял?

Зачем менять слово "игрок", если в названиях команд оно выглядит, как "player"? Я думаю, это будет только мешать пониманию.

Ты хорошо разбираешься в ресурсах. А с помощью чего ты в них копаешься?

sun

Когда статья будет? B)

[ 30 января 2002: Изменил: Vasya ]</p>
#34
Друзья! Пожалуйста по-активнее.
Получается только Vasya, Nivea, AlexIII - работают со скриптовыми командами.
:angry:
#35
Alexy III и все все все!

цитата:</font><hr>
Что бы взять демона в свою партию надо делать так:
@addunittoparty(0,"merc1","Human Gipath NPC Demon F7")
@redeployparty(0)
Причём здесь большой облом вот в чём: "merc1" означает, что добавленный в партию юнит будет называться Хадор-Забияка(для "merc2" - Ная, и т.д).
<hr></blockquote>

Мы уже разобрались, что к чему.(Сан, Вася и я)
поэтому и тебе скажем, что второй пар это имя
из таблицы Pers в Texts.res у каждого имени -прописано название и там есть "Demon" с названием "Человек-Демон" вот можно его вместо
"merc1" брать.

Что бы взять демона в свою партию надо делать так:
@AddUnitToServer("Demon",""Human Gipath NPC Demon F7","Vasya",69,136,0)
@addunittoparty(0,"Demon","Human Gipath NPC Demon F7")
@redeployparty(0)

можно заменить вторую строку:
@addunittoparty(0,"Demon","Human Mercenary Thief")
получится симпатичный демон с телом и лицом Наи
параметрами и именем демона.

PS
Гибриды - Васина идея.
Полная теория - Сан.

[ 31 января 2002: Изменил: Nivea ]</p>
#36
010 AddUnitUnderControl ( float : float, objUnit : object)
Передает юнита под контроль игрока. Предположительно параметр FLOAT - номер игрока... или как сказал Sun в своей статье PlayerGroupDiplomacy. В общем, скорее всего параметр, который я тут назвал FLOAT - это то, что Sun назвал idPlayer. Т.к когда команда проверялась на гоблине, Зак был в игроке 9 (чтоб его не били), но при этом гоблина можно было получить под контроль по команде @addunitundercontrol(0,getobject(4747)), но не @addunitundercontrol(9,getobject(4747)).
После передачи контроля, если это бродячий монстр, сразу вам не подчиняется. И при наведении на него появляется курсор меча (хотя он на вас не нападает). Надо монстра перевести к своему nPlayer, и дать ему команду UmPlayer ( objUnit : object).
Пример - см. в тексте описания команды.

011 AlarmPosX
Параметры неизвестны. Из консоли команда не работает.

012 AlarmPosY
Параметры неизвестны. Из консоли команда не работает.

013 AlarmTime
Параметры неизвестны. Из консоли команда не работает.

015 AttachParticles(float : float ,objUnit : object)
Действие неизвестно.

016 AttachParticleSource (float1 : float, float2 : float)
Действие неизвестно.

017 Attack (Attacker : object, Aim : object),
Юнит с обьектом Attacker атакует юнита Aim.

018 BlockUnit(objUnit : object, lever : float)
Блокирует управление юнитом objUnit, если lever = 1, и разблокирует, если Lever=0, (действует только на юнитов, подчиняющихся игроку). На других не оказывает особого влияния. Если у вашего югита включен режим атаки, то юнит будет нападать на врагов сам, как обычно, или если управление было заблокировано после отдачи какого-либо приказа (например, идти куда-то, или бить кого-то), то юнит продолжит выполнять приказ.

019 Cast (ObjUnit : object, X : float, Y : float)
Заставляет юнита ObjUnit кастовать спелл, которуй у него в наборе активных заклинаний под ¹1 в точку с координатами X,Y. С заклами, кастующимися не на цель, а на место работает. При кастовании заклов, использующихся на цель, игра вылетает (например лечение).

021 CastSpellUnit (SpellStr : string , X, Y, ObjUnit : object)
Кастует на юнита ObjUnit закл SpellStr из точки с координатами X и Y. Закл может быть и "местный", и на цель.

022 ConsoleFloat (float1 : float)
Выводит в консоль значение переменной float1 типа float.

023 ConsoleString (string1 : string)
Выводит в консоль значение переменной string1 типа string.

[ 01 февраля 2002: Изменил: Sagrer[Precursor] ]</p>
#37
Так... Седня с Vasya поговорили насчет партий, и параметра, который всегда 0.
Так вот. Я думаю, что этот параметр 0 - это остатки от Аллодов. В Аллодах разные игроки раскрашивались в разные цвета, а в ПЗ остался только 1 цвет - 0.
Короче создал через консоль партию "HeroAlone", добавил к ней хадаганского Зака, но при создании партии вместо 0 всегда использовал 5.
При попытке сделать "HeroAlone" текущей командами
@setcurrentparty(0,"HeroAlone")
@redeployparty(0)
или
@setcurrentparty(5,"HeroAlone")
@redeployparty(0)
партия не изменяется (точнее еще раз выбирается партия ""), причем в консоли выводится сообщение "party received on client", а Зак "мигает" - исчезает с карты и сразу опять появляется.
Но при вводе
@setcurrentparty(5,"HeroAlone")
@redeployparty(5) никаких сообщений в консоли не меняяется, и Зак не "мигает". Т.е партия HeroAlone создалась для "логического игрока" (назовем так этот параметр) номер 5, и при выборе главной партии она стала главной для игрока 5, но на карте юнитов не появилось, т.к. на ВСЕХ картах похоже только 1 логический игрок - номер 0.
#38
«в глазах круги в мозгу нули…»
Smile


Sagrer[Precursor], идея с раскраской в разные цвета - интересная.
Все-таки, как и что, нужно сделать, чтобы повторить твой опыт? Дал бы ты нам полный список команд из твоего исполняемого файла и написал бы на них своё резюме. И главное: вдруг твой проделанный опыт с ошибкой.
А так у меня лично ощущение, что я подсмотрел в чью-то записную книжку.

«… т.к. на ВСЕХ картах похоже только 1 логический игрок - номер 0.» - Ну это совсем уж, никуда не годится! И что теперь делать с твоим выводом?
#39
Вот некоторые "живые" примеры использования команд,которые нам могут пригодиться:

"Зачаровать дракона"
Вместо Ydragon-подставить GetObjectByID любого врага:
Sleep( 3 )
UMClear( YDragon )
UMFear( YDragon, 0 )
UMAggression( YDragon )
UMFollow( YDragon, GetUnitOfPlayer( 0, 0 ) )
SendStringEvent( 0, "say s3 GTDragon" )

"Включить голема?"
EraseQuestItem( 0, 26 )
RemoveObjectFromServer( GCEmpty )
SetCPFast( GCFull, GetX( GCFull ) , GetY( GCFull ) , -0.05 )
SwitchLeverState( GCFull, 1 )
SetDiplomacy( 0, 3, -1 )
SetDiplomacy( 1, 3, -1 )
SetDiplomacy( 2, 3, -1 )
SetDiplomacy( 3, 0, -1 )
SetDiplomacy( 3, 1, -1 )
SetDiplomacy( 3, 2, -1 )
Guard( GolemSd, GetX( GolemSd ) , GetY( GolemSd ) , 5 )


"Довести юнит до выхода из зоны"
Вместо Borka-подставить GetObjectByID любого врага:

...
Run( Borka )
SetPlayer( Borka, 0 )
UMFollow( Borka, GetUnitOfPlayer( 0, 0 ) )
...


"не разбирался ..."
UMClear( ORunner )
UMAggression( ORunner )
Guard( ORunner, GetX( ORunner ) , GetY( ORunner ) ,
5 )

//Волки бросаются на кабанов
Sleep( 180 )
SetDiplomacy( 4, 5, -1 )
SetDiplomacy( 5, 4, -1 )
Run( this )
UMClear( this )
UMStandard( this )
UMSentry( this, Add( 71, Random( 2 ) ) , Add( 206, Random( 1 ) ) )


//Игра наложницей
CreateParty( 0, "Pretty" )
AddUnitToParty( 0, "Pretty::Nalo", "Human Hadagan Pretty" )
SetCurrentParty( 0, "Pretty" )
LeaveToZone( 0, "gz15h", 3 )
// Каньон Смерти


//Снова Заком
CopyStats( 0, "HeroAlone::Hero", "Hero" )
AddLoot( 0, "HeroAlone", "" )
SetCurrentParty( 0, "" )
FixItems( )
RunWorldTime( 0 )
LeaveToZone( 0, "gz15h", 3 )
// Каньон Смерти

[ 05 февраля 2002: Изменил: Nivea ]</p>
#40
Nivea, Vasya я записал в базу данных ваш разбор функций и процедур (скрипткоманды).
Изменения в скрипткомандах и новые скрипткоманды пишите отдельно, в новых сообщениях.
Как только появитесь, я дам вам таблицы с вашим и моими скрипткомандами.


Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)