Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Город Мастеров _ Шарды рунета _ PC scripting :P

Автор: 2_advanced Jun 27 2005, 01:29

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

в общем задача - повесить
on_spell_cast
on_attack
on_death (ну это не обязательно)
и т.п..

Автор: Lex Jun 27 2005, 01:35

пробовал через лето написать в слоты игрока другие скрипты. Вместо дефолта.
Не вышло.

Автор: Leon PRO Jun 27 2005, 02:03

Я пробовал, но как только игра сохраняет перса, у него тут-же все переменные в полях скриптинга чар-файла (bic) становятся "default"

Автор: LArden Jun 27 2005, 10:03

А попробуйте создать в инвентаре чара некий нон-дроп предмет и вешать переменные на него. Может так получится?

Автор: Lex Jun 27 2005, 12:40

LArden, или туплю я, или одно из двух.. Но причем тут переменные? Мы говорим про скрипты на игрока. Типа onDamage, onDeath (это можно через модульный скрипт сделать, так что наф), onSpellCastAt и прочее..

Автор: helvene Jun 27 2005, 18:29

QUOTE
А попробуйте создать в инвентаре чара некий нон-дроп предмет и вешать переменные на него. Может так получится?

Так не просто получится - так делают.

Автор: K.SpecTr Jun 27 2005, 19:41

QUOTE (2_advanced @ Jun 27 2005, 01:29)
default пашет только как херт бит.. и имхо легче самоповторяющееся действие повесить

в общем задача - повесить
on_spell_cast
on_attack
on_death (ну это не обязательно)
и т.п..

default "пашет" как все эти скрипты вместе взятые, не зря он в каждом слоте. И срабатывает он по всем эвентам для этих слотов.
А что если использовать его как контейнер: все on_xxx как инклюды и запускать соответствующие функции, определяя через свитч, что конкретно было причиной вызова скрипта?
Т.е. если у нас причина атака, то запускаем on_attack - засечена смерть, то on_death.

Автор: 2_advanced Jun 27 2005, 22:36

это будет зверский лаг black eye.gif

Автор: Lex Jun 27 2005, 23:35

"определяя через свитч, что конкретно было причиной вызова скрипта?"
а это как??
Я не придумал пока, как это сделать.
Если напишешь, дай мне. smile.gif У меня Сингл, лаги не будут заметны smile.gif

Автор: K.SpecTr Jun 29 2005, 22:31

Что-то в этом роде:

CODE
void main()
{
// def_xxxx - скрипты на эвенты. Инклюды они или нет, это другой вопрос.
// Не вижу причин для бешеного лага.
if(GetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT) && GetLastPerceptionSeen())
   {
       ExecuteScript(def_percieve,OBJECT_SELF);
   }
if(GetSpawnInCondition(NW_FLAG_DAMAGED_EVENT))
   {
       ExecuteScript(def_damaged,OBJECT_SELF);
   }
if(GetSpawnInCondition(NW_FLAG_DEATH_EVENT))
   {
        ExecuteScript(def_death,OBJECT_SELF);
   }
if(GetSpawnInCondition(NW_FLAG_SPELL_CAST_AT_EVENT))
   {
       ExecuteScript(def_spellcast,OBJECT_SELF);
   }
}

Автор: 2_advanced Jun 29 2005, 23:08

NWNXом менял скрипты, повешанные на чара.. - сервак падал при первом вызове любого скрипта..
буду ковырять дальше =Р

Автор: dumbo Jun 30 2005, 05:58

K.SpecTr
default скрипт работает на PC только как хб, несмотря на то, что прописан во всех слотах - проверено путем написания оного. несмотря на активное поведение PC, тестовая строка падала в лог с методичностью хб. и не более.

а тот скрипт, что ты написал... как бы это так помягче описать... swoon.gif wink.gif

Автор: K.SpecTr Jun 30 2005, 06:17

dumbo
Ну, как бы это так помягче сказать, я никогда (почти) умным скриптером не прикидывался. lol.gif
Я лишь поставил вопрос: может быть можно и так. wink.gif

Автор: Zirrex Jul 5 2005, 23:02

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

Автор: -=PsyXaoc=- Jul 18 2005, 23:14

Наверное все же сюда... Такс
Есть две команды А и Б, они постоянно воют,
Есть нондроп дивайс, на него нужно положить скрипт, чтобы:
1)Записывал кол-во убийств(фрагов) (число X)
2)При убийтве перса ниже чем на 10 уровне вычитать из X единицу
3)Команда, при которой можно узнать хонор статус другого игрока...

Почти уверен, что такая херь есть на волте, только никак не найду...

Автор: dumbo Jul 19 2005, 04:48

QUOTE (-=PsyXaoc=- @ Jul 19 2005, 00:14)
1)Записывал кол-во убийств(фрагов) (число X)

лучший! good.gif
систему такую написать несложно, но нафиК никому, кроме тебя, не надо.
Добавлено в [mergetime]1121737902[/mergetime]
да, по ТЕМЕ: скрипты на PC, кроме хб, просто не вызываются, поэтому менять их названия ни в памяти игры, ни в сэйве смысла не имеет.

Автор: -=PsyXaoc=- Jul 19 2005, 10:50

dumbo
ну раз не сложно, неужели нельзя помочь?

Автор: _kaa_ Jul 20 2005, 09:22

Ты сам начни, будут вопросы - ответим. Никто делать за тебя не станет, но поможем с тем, с чем с ходу не справишся.
В двух словах где тебе рыть:

QUOTE

1)Записывал кол-во убийств(фрагов) (число X)


Тебе нужно отслеживать событие "смерть игрока" - это OnPlayerDying, OnPlayerDeath (в свойствах модуля).
Первое срабатывает, когда у игрока меньше 0 хитпоинтов, второе - когда -10 и меньше.
Если кто-то умирает - генерируется эти события, в них можно получить кто умер
Neverwinter Script Source
object oPC =GetLastPlayerDied();
и кто его убил
Neverwinter Script Source
object oKiller=GetLastHostileActor()
.
QUOTE

2)При убийтве перса ниже чем на 10 уровне вычитать из X единицу

Это гораздо проще. У тебя уже есть убитый и убийца, осталось узнать уровень обоих и сравнить.
Neverwinter Script Source
int PC_level= GetHitDice(oPC); // вернет тебе уровень игрока oPC.
int Killer_level = GetHitDice(oKiller); // уровень убийцы
int frag = 0;
if (Killer_level - PC_level > 10)
    frag = -1
else
    frag = 1;


Теперь надо записать все на вещь:
Neverwinter Script Source
object oNoDropItem = GetItemPossessedBy(oPC,"<тег вещи>");
int Frags = GetLocalInt(oNoDropItem,"Frags"); // прочитали сколько было фрагов
Frags += frag;                                // Frags = Frags + frag, добавили или уменьшили
GetLocalInt(oNoDropItem,"Frags",Frags);      //записали новое значение.


Как только будет сохранение персонажа (при его выходе или при вызове ExportAllCharacters(),ExportSingleCharacter(oPC)) его фраги запишутся в .bic файл игрока, т.е. туда же куда пишется информация об игроке, его уровне, вещях и т.п.

QUOTE

3)Команда, при которой можно узнать хонор статус другого игрока...

Если "хонор" в твоем понимании количество фрагов:

Тебе нужна вещь со свойством Cast Spell:Unique power (unlimit). При ее активации вызывается событие модуля onActivateItem(), в нем тебе нужно проверить, что активированна именно твоя вещь. Скажем вещь твоя имеет тег "honor_viewer"
Neverwinter Script Source
//module onActivateItem()
    object oItem=GetItemActivated();        //что за вещь вызвала скрипт
    object oActivator=GetItemActivator();  //кто активировал
    object oTarget = GetItemActivatedTarget();  //на кого активировали
    string sTag = GetTag(oItem);
   
    if (sTag == "honor_viewer") // если активировали твою вещь, то
    {
        SendMessageToPC(oActivator,  //послать сообщение тому, кто активировал вещь
                        IntToSting(  //посылать можно только строки, поэтому преобразуем число в строку
                        GetLocalInt(GetItemPossessedBy(oTarget,"<тег вещи но дроп>"),"Frags")));
    }


Вариант без проверок. Проверки приделывай сам, надо убедиться что oTarget - игрока (GetIsPC()), что
GetItemPossessedBy(oTarget,"<тег вещи но дроп>") вернет тебе объект, а не OBJECT_INVALID и т.п.

Автор: Vanes Jul 20 2005, 12:33

QUOTE
систему такую написать несложно, но нафиК никому, кроме тебя, не надо

РПшникам может и не надо...
а у меня такая штука с февраля месяца крутится... только не через итем, а в БД...

Автор: -=PsyXaoc=- Jul 20 2005, 12:51

_kaa_
good.gif Респект, разобрался

Автор: Valleo Jul 28 2005, 19:20

QUOTE (Zirrex @ Jul 5 2005, 23:02)
У меня вопрос такого плана. Если уж заговорили про скрипты, которые вешаются на персонажа игрока, то как отличить, кто первый начал атаку. С монстрами это просто, у них свои скрипты, а вот что делать с двумя дерущимися персонажами? Дело в том, что угадать, кто виноват, когда первоуровневый персонаж нападает на высокоуровневого, сложно. А виноват чаще именно тот, кто умер, но попробуй это докажи. Поэтому мне и интересно, можно ли как-нибудь это сделать?

Насчет кто кого првым ударил - на броню повешать OnHitSpellCast и вызывать через него скрипт глобальный, который и будет определять кто кого первым ударил. Главное прикрутить каждой броньке\одежке эту фишку через AddItemProperty, вроде так...

И вообще - я делал через default очень хорошую систему, она осталась в моем первом модуле шарда Энтарион. На второй модуль не буду переводить, так как система всетаки давала хорошенькие лаги, так как скрипт вызывался на КАЖДЫЙ эвент прсонажа.

Автор: 2_advanced Jul 31 2005, 00:59

>OnHitSpellCast
я использовал это для *портящихся вещей и оружия* ((с) biggrin.gif ) - ударил кто-то кого-то - и у него ножик затупился и броньку чужую/щит попортил smile.gif (нафига это нужно? - основа экономики.. )

а на счет - кто кого первым ударил - если только дрыномахальщик дрыномахальщика.. а если кастер?
вставлять что-то для проверки перед запуском соответствующего касту скрипта? имхо изврат маллоэффективный

Автор: dumbo Jul 31 2005, 04:57

QUOTE (2_advanced @ Jul 31 2005, 01:59)
а на счет - кто кого первым ударил - если только дрыномахальщик дрыномахальщика.. а если кастер?

это как раз не есть проблема - spell-hooking(http://www.wrg.ru/forums/index.php?act=ST&f=5&t=764&hl=&view=findpost&p=29001) на то имеется.

Автор: 2_advanced Jul 31 2005, 22:48

а если спелл на область? подвалил злобный сорк и кинул баншу - и спеллхук будет перебирать всех существ в области?
в общем это грузный (и глючащий) гемор ни кому не нужный..

Автор: Valleo Aug 8 2005, 18:47

Кстати, энта, не в тему конечно, но почти по теме.

Leto теперь НЕ может прикрутить к чару SpecAbilList где содержатся спеллы как специальные абилки персонажа. Это было пофиксено биоварями в патче 1.64.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)