Помощь - Поиск - Пользователи - Календарь
Полная версия: Скрипты
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74
Nashman
Привет,
Наоборот, тот скрипт, что я написал на капитана - он на НПС-обычних, а тот, что для обычных - для капитана. Просто перепутал...
QUOTE
че та я не понял, ты что вообще от них хочешь???

Это городской патруль, и они должны патрулировать город, днем нормально, ночью из бегом, и когда ночью ПС подходит слишком близко, то ПС говорит что-то...

QUOTE
Куда именно?

НВ... Разве есть еще что-то зацыкленое?...
QUOTE
И где проверка на текущее время?

Neverwinter Script Source
if (GetIsDay())
{
oTrueFalse=FALSE;
}
else
{
oTrueFalse=TRUE;
}



QUOTE
Второй скрипт именно таким стоит на каждом рядовом?

На капитане... У меня несколько патрулей...(Перепутал tomato.gif )

gennady
Вешай на ХВ командира скрипт, на солдат ни чего не надо...
Neverwinter Script Source
void main()
{
object oW1 = GetWaypointByTag("ast_s_1level001");
object oW2 = GetWaypointByTag("ast_s_1level002");
object oW3 = GetWaypointByTag("ast_s_1level003");
object oSoldat = GetObjectByTag("Soldat_1");
object oSoldat2 = GetObjectByTag("Soldat_2");
object oKom = OBJECT_SELF;
string speak1 = "C дороги!";
string speak2 = "Посторонись!";
string speak3 = "Все по домам! Ни кого не должно быть на улицах ночью!";

object oPC = GetFirstPC();
int oTrueFalse = FALSE;

if (GetIsDay())
{
oTrueFalse=FALSE;
}
else
{
oTrueFalse=TRUE;
}

if (GetDistanceBetween(OBJECT_SELF, oPC) < 8.0 && GetIsNight())
{
switch (Random(3)+1)
{
case 1:
ActionSpeakString(speak1, TALKVOLUME_SHOUT);
break;
case 2:
ActionSpeakString(speak2, TALKVOLUME_SHOUT);
break;
case 3:
ActionSpeakString(speak3, TALKVOLUME_SHOUT);
break;
}
}
if(GetLocalInt(OBJECT_SELF, "MARSH") != 1)
{
ActionDoCommand(AssignCommand(OBJECT_SELF, ActionMoveToObject(oW1, oTrueFalse)));
ActionDoCommand(AssignCommand(OBJECT_SELF, ActionMoveToObject(oW2, oTrueFalse)));
ActionDoCommand(AssignCommand(OBJECT_SELF, ActionMoveToObject(oW3, oTrueFalse)));
ActionDoCommand(AssignCommand(OBJECT_SELF, ActionMoveToObject(oW1, oTrueFalse)));
SetLocalInt(OBJECT_SELF,"MARSH",1);
DelayCommand(15.0,SetLocalInt(OBJECT_SELF,"MARSH",2));
}
AssignCommand(oSoldat, ActionMoveToObject(oKom, oTrueFalse));
AssignCommand(oSoldat2, ActionMoveToObject(oKom, oTrueFalse));
}
gennady
QUOTE (StalkerDtN @ Jan 21 2006, 07:55)
У меня такой вопрос: как можно сделать так, чтобы в какой-нибудь из слотов игрока (INVENTORY_SLOT_*)
нельзя было запихать соответствующую ему(слоту) вещь. Вариант, на подобие, - отлавливать событие одевания предмета с помощью onPlayerEquipItem не рационален, т.к. все равно проигрывается анимация - если это оружие, то взятие его в руку. К тому же очень вероятно, что оружие не уберется

Бывают такие ситуации… Используй скрипт на OnHeartbeat модуля.
Neverwinter Script Source
void main()
{
object oPC = GetFirstPC(); // Игрок
object oItem = GetItemPossessedBy(oPC,"MECH_KLADENEZ"); //  предмет в инвентаре игрока
object oRigHand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);//оружие правой руки
if (GetTag(oRigHand) == "MECH_KLADENEZ")
{
CopyItem(oItem, oPC);
DestroyObject(oRigHand,0.04);
FloatingTextStringOnCreature("Меч перевесил вас…", oPC);
}
}
Equalizer
Меня интерисует вот что,не подскажите как лучше реализовать систему получения экспы в модуле или может кто-то может выложить хороший, проверенный скрипт?
[MoF]Darth_Nick
на вольте, если мне не изменяет память, несколько штук таких скриптов...
L33t
Подскажите, пожалуйста, пример скрипта, который реализует следующее: при взятии в правую руку топора с тегом Т происходит проверка - нет ли в радиусе 30 футов от держащего существ определенного вида (например, эльфов). Если есть, то на топор навешивается свечение (как визуальный эффект). Когда в радиусе 30 футов от держащего нет ни одного эльфа или же топор вынули из правой руки, свечение снимается.
StalkerDtN
Привет, L33t
попробуй ниже приведенным скриптом, он вешается на OnPlayerEquipItem
Neverwinter Script Source
object oPC  = GetPCItemLastEquippedBy(); // игрок, взявший топор в руку
    object oTopor = GetObjectByTag("T"); // собствено сам топор
    float dt = 1.0f, distance = 30.0f; // время обработки + дистанция
    int   ip = ITEM_VISUAL_EVIL; // визуальный эффект топора
//==============================================================================
void check();
//==============================================================================
void check()
{
    object oNear = GetNearestCreature(CREATURE_TYPE_RACIAL_TYPE, RACIAL_TYPE_ELF, oPC);
    itemproperty ipFirst;

    if (GetDistanceBetween(oPC, oNear) < distance)
    if (!GetLocalInt(oPC, "TOPOR"))
    {
        SetLocalInt(oPC, "TOPOR", 1);
        SendMessageToPC(GetFirstPC(), "Эльфы рядом!...МОЧИ ИХ!");
        AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyVisualEffect(ip), oTopor);
    }
    if (GetDistanceBetween(oPC, oNear) > distance)
    if (GetLocalInt(oPC, "TOPOR"))
    {
        ipFirst = GetFirstItemProperty(oTopor);
        while (GetIsItemPropertyValid(ipFirst))
        {
            if (GetItemPropertyType(ipFirst) == ITEM_PROPERTY_VISUALEFFECT)
            {
                SetLocalInt(oPC, "TOPOR", 0);
                RemoveItemProperty(oTopor, ipFirst);
                break;
            }
            ipFirst = GetNextItemProperty(oTopor);
        }
    }
    if (!GetLocalInt(GetModule(), "UNEQUIPPED"))
    DelayCommand(dt, check());
}
//==============================================================================
void main()
{
    object oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);

    if (oItem == oTopor){SetLocalInt(GetModule(), "UNEQUIPPED", 0); check();}
}


Одно НО в нем для укорочения кода применина рекурсия так, что если покажется, что слишком тормозит просто продублируй функцию check(), но вообще это врят ли будет сильно заметно. declare.gif

PS: забыл добавить - в скрипте на событий OnPlayerUnEquipItem допиши строчки
Neverwinter Script Source
object oItem = GetPCItemLastUnequipped();
object oTopor = GetObjectByTag("T");
if (oItem == oTopor) SetLocalInt(GetModule(), "UNEQUIPPED", 1);
Ангелиус
Можно сделать такую фишку как: скажем я играю одним персом, но активировав самодельное заклинание мой перс превращается в другого перса сделаного отдельно (существо) со своими навыками и в зависимости от опыта моего реального перса дается опыт и тому в которого я превращусь? Получается что-то вроде магии смены формы. Просто есть гениальная задумкаsmile.gif))
Lex
можно.

Смена формы либо так:
Neverwinter Script Source
// Sets the creature's appearance type to the value specified (uses the APPEARANCE_TYPE_XXX constants)
void SetCreatureAppearanceType(object oCreature, int nAppearanceType)

Поменяется только внешний вид.
либо так:
Neverwinter Script Source
// Create a Polymorph effect.
effect EffectPolymorph(int nPolymorphSelection, int nLocked=FALSE)

+ прописка в рolymorph.2da нужного тебе существа.

Выдача опыта через
Neverwinter Script Source
// Sets oCreature's experience to nXpAmount.
void SetXP(object oCreature, int nXpAmount)

и схожие с XP.

Навыки.. тут сложнее. Полиморфу можно прописать 3 уникальных НОВЫХ способности. Убрать старые никак, только делевелом в 0. Но скорее всего придется делать через шкурку и дачу свойств ей (это правка еще пары 2дашек)

подумай дважды, тебе нужен этот геморой или не очень. Можно обойтись просто сменой формы + парой новых способностей.
Ангелиус
Цитата(Lex @ Feb 15 2006, 20:17) [snapback]70151[/snapback]

можно.

Смена формы либо так:
Neverwinter Script Source
// Sets the creature's appearance type to the value specified (uses the APPEARANCE_TYPE_XXX constants)
void SetCreatureAppearanceType(object oCreature, int nAppearanceType)

Поменяется только внешний вид.
либо так:
Neverwinter Script Source
// Create a Polymorph effect.
effect EffectPolymorph(int nPolymorphSelection, int nLocked=FALSE)

+ прописка в рolymorph.2da нужного тебе существа.

Выдача опыта через
Neverwinter Script Source
// Sets oCreature's experience to nXpAmount.
void SetXP(object oCreature, int nXpAmount)

и схожие с XP.

Навыки.. тут сложнее. Полиморфу можно прописать 3 уникальных НОВЫХ способности. Убрать старые никак, только делевелом в 0. Но скорее всего придется делать через шкурку и дачу свойств ей (это правка еще пары 2дашек)

подумай дважды, тебе нужен этот геморой или не очень. Можно обойтись просто сменой формы + парой новых способностей.


Просто я хочу небольшой сюжетик в оригинальном НВН сделать, чисто чтобы разнообразить игру. Задумка такая, я начинаю играть призраком который не может практически наносить повреждения, а чтобы попасть в этот мир я через полиформу призываю уникальное тело которым я и сражаюсь. Для этого мне и необходимо, чтобы опыт распространялся на 2х ибо уникальным телом будет именно обычное игровое (персональное). Если есть возможность Лекс стукни пжл. в асю чтобы я форум не засорял, т.к. я начинающий (аська 328-816-428).
Lex
Цитата
Если есть возможность Лекс стукни пжл. в асю чтобы я форум не засорял, т.к. я начинающий (аська 328-816-428).

Звиняй, возможность стукнуть конечно есть, но дел и своих более чем хватает. А форум как раз для того и есть, чтобы учиться. Только перед этим хорошо бы ознакомиться с мануалами и другими полезными материалами, а потом уже спрашивать конкретно то, что НЕ ПОЛУЧАЕТСЯ СДЕЛАТЬ самому. Вариант "сделайте мне" скорее всего останется без ответа, ибо тут все занятые люди.
Ангелиус
Цитата(Lex @ Feb 15 2006, 22:27) [snapback]70163[/snapback]

Звиняй, возможность стукнуть конечно есть, но дел и своих более чем хватает. А форум как раз для того и есть, чтобы учиться. Только перед этим хорошо бы ознакомиться с мануалами и другими полезными материалами, а потом уже спрашивать конкретно то, что НЕ ПОЛУЧАЕТСЯ СДЕЛАТЬ самому. Вариант "сделайте мне" скорее всего останется без ответа, ибо тут все занятые люди.

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

Neverwinter Script Source
// наложение постоянного визуального эффекта на игрока
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE), GetFirstPC());
Night Elf
Люди помогите... напишите кто-нибудь скрипт : мне нуно что-бы фермер после определенной фразы давал мне предмет "колечко" напишите скрипт.. очень нужно....
[MoF]Darth_Nick
мдямс...это помойму уже смешным становиться..
фраза где? в диалоге или просто в чат?
энивей ф-ция дающая айтем и создающая его

Neverwinter Script Source
// Give oItem to oGiveTo
// If oItem is not a valid item, or oGiveTo is not a valid object, nothing will
// happen.
void ActionGiveItem(object oItem, object oGiveTo)


Neverwinter Script Source
// Create an item with the template sItemTemplate in oTarget's inventory.
// - nStackSize: This is the stack size of the item to be created
// * Return value: The object that has been created.  On error, this returns
//  OBJECT_INVALID.
// If the item created was merged into an existing stack of similar items,
// the function will return the merged stack object. If the merged stack
// overflowed, the function will return the overflowed stack that was created.
object CreateItemOnObject(string sItemTemplate, object oTarget=OBJECT_SELF, int nStackSize=1)


на крайняк можно и лексикон открыть...или когда ф-цию ищещ набрать слово Item или Give
Zirrex
Возник вопрос, как удалить определенное существо, когда игрок покидает локацию, причем не просто выходит через триггер, а выходит с сервера. Если повесить скрипт проверки на триггер, и просто покидать триггер, то работает все замечательно, но когда покидаешь сервер, скрипт похоже не успевает сработать.

Сам скрипт:
Neverwinter Script Source
////////////////////////////////////////////
// Amen Hardcore system
////////////////////////////////////////////
// Arena System - Player Enter Trigger
// File: ahs_arn_tr_exit
////////////////////////////////////////////
// Персонаж выходит с триггера. Если там
// остались существа, они удаляются.
////////////////////////////////////////////
// Author: Zirrex
// Date: 26 January 2006
////////////////////////////////////////////

void main()
{
    object oMod = GetModule();

    object oPC = GetExitingObject();
   
    // отфильтровать
    if (GetIsDM(oPC) || !GetIsPC(oPC) || GetIsDMPossessed(oPC)) return;
   
    string sCreature = GetPCPublicCDKey(oPC);

    object oCreature = GetFirstObjectInArea(OBJECT_SELF);

    while (GetIsObjectValid(oCreature))
    {
        if (GetIsEnemy(oPC, oCreature))

        // Если тэг существа схож с ключом, то продолжить
        if (GetTag(oCreature) == sCreature)
        {
            AssignCommand(oCreature, ClearAllActions(TRUE));
            AssignCommand(oCreature, SetIsDestroyable(TRUE, FALSE, FALSE));
            DestroyObject(oCreature);
        }
        oCreature = GetNextObjectInArea(OBJECT_SELF);
    }

    SetLocalInt(oPC, "FightArena", 0);
    SetLocalInt(oMod, "WorkArena", FALSE);
}

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

Следующий вопрос. У всех существ в их свойствах есть флаг "Leaves lootable corpse", который позволяет превращать труп существа в подобие инвентаря, из которого можно извлекать вещи. Все бы хорошо, но когда "инвентарь" такой не открываешь, то по исчезновении трупа на месте смерти существа остается невидимый объект, который горит яркой точкой при нажатии на Tab. Если убить существ этак 100-200 в одном месте, то локация начинает подтормаживать. Но это ерунда, самое главное, что при выделении валяющихся вещей через Tab все это дико рябит в глазах. Какой флаг отвечает за действие персонажа в момент открытия инвентаря существа? Если его переключать, когда удаляется существо с нетронутыми вещами, то удаляться будет и невидимый объект. Или же подскажите, какое имя носит этот объект, чтобы непосредственно к нему обращаться в момент удаления.
Night Elf
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: FileName at_015
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Script Wizard
//:: Created On: 16.02.2006 14:38:42
//:://////////////////////////////////////////////
void main()
{

    CreateItemOnObject("doom_1", GetPCSpeaker(), 1);

}


хм.. а этот скрипт для чего? (его можно преобразовать в рабочий чтоб предметик получить?) а то я вот усе уже сделал а с выдачей предметов трабла.... можт кто напишет мне скриптик выбачи любого предмета... а... ?
Zirrex
Night Elf, такой скрипт обычно вешается на диалог. Самый простой диалог:

NPC: Здравствуйте, странник!
PC: 1. Выдай мне предмет.

Скрипт вешается на действие "Actions taken". В данном случае действием является активация пункта диалога.

Да, также совет. Если ты будешь делать много кастомных предметов, то делай им уникальные тэги.

Например: axe_it_name, где it - item, name - сокращенное название предмета.

Цитата

Описание функции "CreateItemOnObject":
This function creates an item with the template sItemTemplate in oTarget's inventory. If you are creating a custom item, sItemTemplate is the ResRef; if you are creating a standard item, sItemTemplate is the item's tag.
_kaa_
Цитата(Zirrex @ Feb 16 2006, 13:55) [snapback]70222[/snapback]

Возник вопрос, как удалить определенное существо, когда игрок покидает локацию, причем не просто выходит через триггер, а выходит с сервера. Если повесить скрипт проверки на триггер, и просто покидать триггер, то работает все замечательно, но когда покидаешь сервер, скрипт похоже не успевает сработать.

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

В момент выхода игрока с сервера часть информации об игроке уже недоступно. В частности CDKEY. Подробнее должно быть где-то в шардах, кажется тут: http://www.wrg.ru/forums/index.php?showtopic=241
Там же были советы по решению таких проблем.
mamuc
то Zirrex
Цитата
Возник вопрос, как удалить определенное существо, когда игрок покидает локацию, причем не просто выходит через триггер, а выходит с сервера.


маленькое проедложение по твоему скрипту : может надо немношко оптимизировать код ... поскольку тебе нужны именно CREATURE, а перебираеться все обьекты на локе, то лучше проверять
if (GetObjectType(oCreature)==OBJECT_TYPE_CREATURE)
а не if (GetIsEnemy(oPC, oCreature)) - ведь не забудем, что очень многие обьекты ( двери плейсы итд по дефоулту враждебны к PC biggrin.gif )

и надо бы уточнить : этот PC единственный возможный в локе арены? или там может быть целая толпа?
(если один то гораздо проще)
а так можно повесить скрипт на onHeartbeat арены и смотреть есть ли хоть один PC на арене..если нету - сносить всех неписей ( если там вошли нескоко игроков, то по идее они одна комада и все неписи ко всем PCям Enemy..значит ихнадо оставить)...другой вопрос, что надо бы отлавливать таких " героев" альтеров и выдавть что-то типа "почетного" приза - заячих ушей или хвостика declare.gif
[MoF]Darth_Nick
Цитата
Возник вопрос, как удалить определенное существо, когда игрок покидает локацию, причем не просто выходит через триггер, а выходит с сервера. Если повесить скрипт проверки на триггер, и просто покидать триггер, то работает все замечательно, но когда покидаешь сервер, скрипт похоже не успевает сработать.

я щас сонный, мог и не понять вопроса.
почему бы не сделать локалку
чел заходит она += 1
выходит -= 1
на выходе проверяеш, если == 0,удаляеш то что надо...( подразумевается что игрок не 1)
ведь когда срабатывает OnClientLeave тогда же и срабатывает OnAreaExit по идее
Night Elf
Zirrex, да я эт понял.. ты мне можешь скрипт написать выдачи любого предмета? всеравно какого я потом подставлю... просто уже недель 2 бьюсь а толку........
[MoF]Darth_Nick
да йопт, я же дал тебе ф-ции...
CreateItemOnObject - создает "на" объекте айтем по ресрефу из палитры

object CreateItemOnObject(string sItemTemplate, object oTarget=OBJECT_SELF, int nStackSize=1)

sItemTemplate - ресреф
oTarget=OBJECT_SELF меняеш на объект, по умолчанию OBJECT_SELF
nStackSize - "стек"..типа кол-во, для стрел там, болтов. по умолчанию 1

Какие тут вопросы еще могут быть? о.О
Если мне память не изменяет, у биовар в тулсете встроен мастер скриптов(нупских, ну да ладно) и там вроде было это...
я уже не знаю как проще объяснить )
Ангелиус
Может я чего-то не понимаю, но вот скажем компилирую я в редакторе скриптов ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE), GetFirstPC()); Ошибок нет.
Сохраняю под каким-то именем скажем xxxxxx. Захожу в редактор перса, там нажимаю кнопку добавить скрипт (или что-то в этом роде), вручную пишу имя xxxxxx типа int. Экспортирую перса в формат erf, редактирую HEX и переношу в bic, далее перс «готов», но в игре ничего не сработало. Я начинающий может, что не так делаю. И еще есть ли какой-нить менее болезненный способ создания перса в обход HEX-редактора, Leto не предлагать.
Lex
нихренасебечтоэто????
Ты че за геморой себе на голову придумал?
если по простому, то вот:
onModuleEnter
Neverwinter Script Source
void main()
{
object oPC = GetEnteringObject();
if (!GetIsPC(oPC)) return;
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_DUR_GHOSTLY_VIS
AGE), oPC);
}
StalkerDtN
Ангелиус, какие бы ты на своего перса эффекты не вешал, подобным образом, все это безполезно, тк все скрипты с твоего героя убираются движком игры. Если хочешь чтобы этот эффект был на твоем герое пользуйся стандартными вещами. declare.gif


ЗЫ: Кстати, не обязательно через erf - сначала создаешь кого тебе надо в редакторе, сохраняешься, открываешь модуль в nwhak.exe, находишь его по ResRef-у (перца конечно же), экспортируешь, изменяешь расширение с utc на bic, открываешь, например, FAR-ом первые три буквы UTC заменяешь на BIC - все можешь играть.
Zirrex
mamuc, если учесть, что у меня переключается переменная в момент боя, то альтеру будет очень неудобно после перезахода. Т.е. он просто умрет.

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

Думал, как повесить переменную на копию персонажа в момент создания, да так ничего путного и не получилось.

Да, я добавлял эту проверку, просто забыл внести в скрипт. Мучился с хартбитом на локацию, так он мне даже тэг двери выдавал, когда я проверял через сообщения, насколько верно скрипт работает smile.gif

_kaa_, это конечно все хорошо, но нужна эта информация в момент выхода игрока. Либо же после выхода игрока крутить на хартбите скрипт и проверять, есть ли этот игрок или нету. Если нет, удалить оставшихся существ.

Кстати, вы наверняка обратили внимание на функцию:
Neverwinter Script Source
AssignCommand(oCreature, SetIsDestroyable(TRUE, FALSE, FALSE));

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

Night Elf, так ты его сам уже написал smile.gif Единственное, что тебе в нем нужно будет менять, это имя предмета. Если не понимаешь скрипты, почитай их описания, изучи хотя бы азы написания скриптов. Тебе надо понимать, что ты делаешь, иначе это как биться головой об стену.

[MoF]Darth_Nick, самое смешное, что сам его написал smile.gif

Ангелиус, у персонажа есть свой скрипт, default, и все. Создай его в редакторе. Сохрани под таким именем, и вставь скрипт, который тебе написал Лекс, немного его изменив под хартбит.

Neverwinter Script Source
void main()
{
    object oPC = OBJECT_SELF;

    if (!GetIsPC(oPC)) return;
   
    if (GetHasEffect(EFFECT_TYPE_ETHEREAL, oPC) == FALSE)
    {
        ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_GHOSTLY_VISAGE), oPC);
    }   
}

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

All, то ли у меня уже крыша едет, то ли я делаю что-то не так smile.gif Наипростейший скрипт, но не желает работать, хоть ты тресни. И тэг верный, и сам скрипт, срабатывают все условия, а сама функция, нет.

Neverwinter Script Source
if (GetLocalInt(oKiller, "Quest1") == TRUE)
{
    if ((sTag == "am_bst_goblin_elite_a") ||
        (sTag == "am_bst_goblin_elite_b"))
    {
        CreateItemOnObject("am_it_goblinhead", oKiller, 1);
        SendMessageToPC(oKiller, "Нужный для квеста гоблин.");
    }
}

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

Гм... я конечно все понимаю, но почему же тогда эта функция работает в других местах нормально без такого добавления?
Neverwinter Script Source
object oHead = CreateItemOnObject("am_it_goblinhead", oKiller, 1);

Стоило это внести, заработала функция.
Lex
Zirrex, то, что ты написал не будет работать вот тут:
Neverwinter Script Source
if (GetHasEffect(EFFECT_TYPE_ETHEREAL, oPC) == FALSE)

потому что ВИЗУАЛКА это тебе не ЭФИРНЫЙ ВИД smile.gif
Zirrex
Lex, а что же это тогда такое? Просто сделать проверку на "EFFECT_TYPE_VISUALEFFECT"? Кстати, иногда возникают вопросы, как снять некоторые эффекты без последствий снятия всех эффектов, которые наложены на персонаже.

Например, изменилось значение силы на 2 единицы, и нужно сбросить именно этот эффект. Только как определить его?
Lex
Цитата
Lex, а что же это тогда такое? Просто сделать проверку на "EFFECT_TYPE_VISUALEFFECT"?

ну та проверка, что написал ты это на вот этот эффект:
Neverwinter Script Source
// Returns an effect of type EFFECT_TYPE_ETHEREAL which works just like EffectSanctuary
// except that the observers get no saving throw
effect EffectEthereal()

в принципе можно и визуалку проверять. Там не должно быть проблем. Но я не понимаю смысла ставить в ХБ. Если игрок сначала дух, потом уже живой, то проще ставить/снимать визуалку при переходе. И кстати момент, чтобы не слетела от отдыха, ставить
Neverwinter Script Source
// Set the subtype of eEffect to Supernatural and return eEffect.
// (Effects default to magical if the subtype is not set)
// Permanent supernatural effects are not removed by resting
effect SupernaturalEffect(effect eEffect)


Цитата
Например, изменилось значение силы на 2 единицы, и нужно сбросить именно этот эффект. Только как определить его?

Эх.. старая беда.
Юзая такие вещи:
Neverwinter Script Source
// Get the object that created eEffect.
// * Returns OBJECT_INVALID if eEffect is not a valid effect.
object GetEffectCreator(effect eEffect)

// Get the duration type (DURATION_TYPE_*) of eEffect.
// * Return value if eEffect is not valid: -1
int GetEffectDurationType(effect eEffect)

// Get the subtype (SUBTYPE_*) of eEffect.
// * Return value on error: 0
int GetEffectSubType(effect eEffect)

// Get the effect type (EFFECT_TYPE_*) of eEffect.
// * Return value if eEffect is invalid: EFFECT_INVALIDEFFECT
int GetEffectType(effect eEffect)

я например делал особые эффекты типа Супернатурал, потом искал понижалки силы этого типа и удялал.

Но имхо тут проще шкуркой smile.gif
Zirrex
Lex, я это знаю. Именно так и распределено в моем модуле. Просто, раз уж зашел вопрос, что это за тип эффекта, то, наверное, стоит точно указать к чему относится именно "VFX_DUR_GHOSTLY_VISAGE".

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

И все равно, как не крути, но эффекты все эти временные, и поэтому подсвечивают измененные характеристики зеленым цветом. Естественно в момент поднятия уровня такие бонусы не учитываются. Особенно это касается интеллекта.

Не помню где именно, но видел на одном шарде работу то ли скрипта, то ли программы, которая изменяла характеристики персонажа под субрассу, и так их сохраняла. Причем они не менялись вторично после перезахода. Знать бы как.
dumbo
Цитата(Zirrex @ Feb 17 2006, 01:22) [snapback]70283[/snapback]

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

храните деньги в сберегательных кассах! ...а бонусы в БД. я так думаю. buba.gif

Цитата(Zirrex @ Feb 17 2006, 01:22) [snapback]70283[/snapback]

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

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

П.С : прошу не посылать меня на воулт=)
[MoF]Darth_Nick
http://www.wrg.ru/forums/index.php?showtopic=211&st=0
тут глянь

или покажи что написал, трдно судить, когда скрипта нету...
Артём
Я хотел узнать может ли игрок переселила в другое создание. Если да то напишите крипт. Заранее благодарен.
[MoF]Darth_Nick
меняеш апиренс, вешаеш айтем\шкуру..ф-ции:
Neverwinter Script Source
// Sets the creature's appearance type to the value specified (uses the APPEARANCE_TYPE_XXX constants)
void SetCreatureAppearanceType(object oCreature, int nAppearanceType)

и
Neverwinter Script Source
// Equip oItem into nInventorySlot.
// - nInventorySlot: INVENTORY_SLOT_*
// * No return value, but if an error occurs the log file will contain
//  "ActionEquipItem failed."
//
// Note:
//      If the creature already has an item equipped in the slot specified, it will be
//      unequipped automatically by the call to ActionEquipItem.
//
//      In order for ActionEquipItem to succeed the creature must be able to equip the
//      item oItem normally. This means that:
//      1) The item is in the creature's inventory.
//      2) The item must already be identified (if magical).
//      3) The creature has the level required to equip the item (if magical and ILR is on).
//      4) The creature possesses the required feats to equip the item (such as weapon proficiencies).
void ActionEquipItem(object oItem, int nInventorySlot)

ну и
Neverwinter Script Source
// Assign aActionToAssign to oActionSubject.
// * No return value, but if an error occurs, the log file will contain
//  "AssignCommand failed."
//  (If the object doesn't exist, nothing happens.)
void AssignCommand(object oActionSubject,action aActionToAssign)


тулсета под рукой нету, так что как то так:

Neverwinter Script Source
void main()
{
    object oPC;  // сам поменяеш
    object oItem;      // и ет тоже
    SetCreatureAppearanceType(oPC,APPEARANCE_TYPE_NWN_ARIBETH_EVIL); // и здесь еще константу
    AssignCommand(oPC,ActionEquipItem(oItem,INVENTORY_SLOT_CARMOUR));
}


по желанию вставиш ефекты и т.д.
ф-ции так..для общего развития
глянь еще инслюд nw_i0_transform
Equalizer
void main()
{
object Player = GetEnteringObject();
string WW = GetTag(GetArea(Player));
string sCDKEY = GetPCPublicCDKey(Player);
string sName = GetName(Player);
string sPCName = GetPCPlayerName(Player);
string sID = "(("+sPCName+"))"+sName;

if (GetIsDM(Player)) return;

string sReadID = GetCampaignString("Security",sID);

if (!GetLocalInt(GetModule(),"SecurityDisable") &&
GetIsObjectValid(GetItemPossessedBy(Player,"mg_bootstone")))
{
BootPC(Player);
return;
}

if (sReadID =="" || GetLocalInt(GetModule(),"SecurityDisable"))
{
SetCampaignString("Security",sID,sCDKEY);
return;
}

if (sReadID != sCDKEY && !GetLocalInt(GetModule(),"SecurityDisable") )
{
BootPC(Player);
SendMessageToAllDMs("Security: Error! "+sName+" :["+sPCName+"]: with key ="+sCDKEY+ " != "+sReadID);
WriteTimestampedLogEntry("Security: Error! "+sName+" :["+sPCName+"]: with key ="+sCDKEY+ " != "+sReadID);
return;
}

все компилируется,но почему-то не работает,или тулсет тупит или не знаю...


так извеняюсь ,не то скопировал...поищу свой еще.
Да и этот который я только что нашел,как сделать чтобы сдкей записывался в шмотку в инвентаре,а не в базу?В моем он просто не записывает правильно.
Zirrex
Equalizer, чертовски знакомый код, только вот модуль, в котором этот код использовался, не для широкого использования. Откуда он у тебя?

Работу скрипта не проверял, но вроде должно работать:
Neverwinter Script Source
object GetPlayerSpirit(object oPlayer);

object GetPlayerSpirit(object oPlayer)
{
    object oItem = GetFirstItemInInventory(oPlayer);

    if (GetResRef(oItem) == "am_it_info") return oItem;

    while (oItem != OBJECT_INVALID)
    {
        oItem = GetNextItemInInventory(oPlayer);

        if (GetResRef(oItem) == "am_it_info") return oItem;
    }
    return OBJECT_INVALID;
}

void main()
{
    object oPC = GetEnteringObject();
    object oSpirit = GetPlayerSpirit(oPC);

    string sCDK = GetPCPublicCDKey(oPC);
    string sName = GetName(oPC);
    string sID = sName + sCDK;   

    if (oSpirit == OBJECT_INVALID)
    {
        oSpirit = CreateItemOnObject("am_it_info", oPC, 1);

        int nID = GetCampaignInt("Info", "Player") + 1;

        SetLocalInt(oSpirit, "ID", nID);
        SetLocalString(oSpirit, "NamePublic", sID);       
        SetCampaignInt("Info", "Player", nID);
    }

    string sInfo = GetLocalString(oSpirit, "NamePublic");

    if (sInfo != sID)
    {
        BootPC(oPC);
        return;
    }   
}
Артём
Кто знаит скрипт для поевления текста один рас в день пожалуйста напишыте или хотябы подскажыте где его можно взять. unsure.gif
Aiwan
Цитата
Кто знаит скрипт для поевления текста один рас в день пожалуйста напишыте или хотябы подскажыте где его можно взять.

Правильно поставленный вопрос и сформулированная задача, уже половина ответа. Вопрос неконкретный. Например, текст появляется у швабры над головой? Раз в день? Или у НПС? Или в диалоге?
NedWarN
Hi All!Сорри давно небыл просто.
Накапилась куча вопросов.
1. Как сделать проверку.
Входиш в локу если в Журнале есть заметка с квестом, то идёт Кат-сценка. если нет то нет.
2. Делаю Непися Невидемым, а снать невидимость некак, я уж и так и сяк. Некак. Делаю его Невидемым через Триггер, и в Идеале бы хотелось снять невидимость в Диалоге.
[MoF]Darth_Nick
1. а повесить на чара локалку нельзя?
2. к примеру так...(я вешал сначала инвиз, потом через пару сек убирал его)(если ты конено, о кат сценовом инвизе):

Neverwinter Script Source
RemoveEffect(oPC,GetFirstEffect(oPC));


в других случаях может и не получиться, тогда проверку сделать надо...
Артём
кто знаит скрипт для поевления текста один рас в день в диологе пожалуйста напишыте или хотябы подскажыте где его можно взять. unsure.gif
mamuc
Цитата
кто знаит скрипт для поевления текста один рас в день в диологе пожалуйста напишыте или хотябы подскажыте где его можно взять.

mosking.gif ....мммм Артем возможно вам сначало надо немного освоить правописание, а потом уже заняться работой с тулсетом...
..а сделать то, что вы хотите можно с помощью навешивания локальной переменной(= время, если надо 1 раз в день или что-то типа TRUE\FALSE если надо, что бы это происходило вообще только один раз) на НПСя с которым говорит игрок и проверки значения этой переменной перед началом соотв.ветки диалога
L33t
Спасибо всем, кто помогал. Я уже решил проблему, все гораздо проще. Вот код:

Neverwinter Script Source
// Автор: L33t
// Модуль: Кривой Долъ
// Описание: Если в радиусе 30 фт от РС есть (полу)эльфы,
//          повесить красное свечение на кинжал, если нет, снять.

int ElvesNearby (object oCenter) // функция проверки эльфов в радиусе 30 фт.
{
    location lTarget = GetLocation (oCenter);
    object oNearby = GetFirstObjectInShape (SHAPE_SPHERE, 30.0, lTarget);
    while (oNearby!=OBJECT_INVALID) {
        if  (GetRacialType(oNearby) == RACIAL_TYPE_ELF)
            return TRUE;
        if  (GetRacialType(oNearby) == RACIAL_TYPE_HALFELF)
            return TRUE;
        oNearby = GetNextObjectInShape (SHAPE_SPHERE, 30.0, lTarget, FALSE);
    } // на первом же найденном остановится
    return FALSE;
}

void main()
{
    object oPC = GetFirstPC();
    object oItem;
    itemproperty ipRedLight = ItemPropertyVisualEffect (ITEM_VISUAL_EVIL);
    itemproperty ipVsElf = ItemPropertyEnhancementBonusVsRace (IP_CONST_RACIALTYPE_ELF,10);
    itemproperty ipVsHalfelf = ItemPropertyEnhancementBonusVsRace (IP_CONST_RACIALTYPE_HALFELF,10);

    while (oPC!=OBJECT_INVALID) {
        oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
        if (GetTag(oItem)=="CD_IT_WBLDAGPG") {
            if (ElvesNearby(oPC)) {
                AddItemProperty  (DURATION_TYPE_TEMPORARY,ipRedLight,oItem,6.2f);
                AddItemProperty  (DURATION_TYPE_TEMPORARY,ipVsElf,oItem,6.2f);
                AddItemProperty  (DURATION_TYPE_TEMPORARY,ipVsHalfelf,oItem,6.2f);
            }
        }
        oPC = GetNextPC();
    }

}


Этот скрипт делает именно то, что мне нужно, а именно:
- если в правой руке игрока находится нужный предмет (тег CD_IT_WBLDAGPG), и рядом есть (полу)эльфы, кинжал светится красным.
- если рядом нет (полу)эльфов, кинжал не светится.
NedWarN
[MoF]Darth_Nick
Я чо такой Душный как кажуся smile.gif
Конечно я делал это, но фига. Лаг наверное в том что я Делаю Чара невидемым триггером, а пытаюсь снять в диалоге.
2. Локалка Чото непашит, 100 раз пробовал. smile.gif
azathoth
поевления текста один рас в день
Neverwinter Script Source
int StartingConditional()
{
    object oPC = GetPCSpeaker();
    int nDay = GetCalendarDay();
    if (GetLocalInt(oPC, "once_a_day_phrase") != nDay)
    {
        SetLocalInt(oPC, "once_a_day_phrase", nDay);
        return TRUE;
    }
    return FALSE;
}
Zirrex
Проклятье, ну почему у персонажа игрока нет нормальных скриптов кроме "default", к которым можно было бы привязаться? Из-за этой ерунды приходиться мучаться с его копией, к которой не знаешь как подступиться.

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

Neverwinter Script Source
void main()
{
    object oMod = GetModule();

    string sEnemy, sCreature, sPlayer, sPerson = "";
    object oEnemy, oPC;

    // Поиск первого существа в локации
    object oCreature = GetFirstObjectInArea(OBJECT_SELF);

    // Отфильтровать ненужные объекты, и заняться поиском существ
    if (GetObjectType(oCreature) == OBJECT_TYPE_CREATURE)
    // Удостовериться, что существо не подпадает под категорию нижеследующих
    if (!GetIsDM(oCreature) || !GetIsPC(oCreature) || !GetIsDMPossessed(oCreature))

    // Если существо есть, то продолжить
    while (GetIsObjectValid(oCreature))
    {
        // Если требуемое слово совпадает с правой частью тэга существа, то продолжить
        if (GetStringRight(GetTag(oCreature), 6) == "_enemy")
        {
            // Запомнить существо
            oEnemy = oCreature;
            // Узнать тэг существа
            sCreature = GetTag(oEnemy);

            // Проверить, не мертвое ли оно
            if (GetIsDead(oCreature))
            {
                // Узнать тэг существа
                sEnemy = GetTag(oEnemy);
                // Переключить функцию, чтобы можно было удалить существо
                AssignCommand(oEnemy, SetIsDestroyable(TRUE, FALSE, FALSE));
            }
        }
        // Поиск следующего существа в локации
        oCreature = GetNextObjectInArea(OBJECT_SELF);
    }

    int nCreature = FALSE;

    // Найти первого персонажа
    object oPlayer = GetFirstPC();

    // Если персонаж есть, то продолжить
    while (GetIsObjectValid(oPlayer))
    {
        // Узнать паблик персонажа
        sPlayer = GetPCPublicCDKey(oPlayer);

        // Удостовериться, что персонаж на Арене
        if (GetTag(GetArea(oPlayer)) != "amen_gt_arena") return;

        // Сравнить паблик с тэгом найденного существа, проверяя первые 8 знаков слева
        if (GetStringLeft(sCreature, 8) == sPlayer)
        {
            // Если совпал, оставить ключ в положении 'FALSE'
            nCreature = FALSE;
        }
        else
        {
            // Если нет, то переключить на 'TRUE'
            nCreature = TRUE;
        }

        // Если ключ в положении 'FALSE', проверить, кто последний бил существо
        if (!nCreature)
        {
            // Персонаж, который последний ударил
            oPC = GetLastAttacker(oEnemy);
            // Узнать паблик игрока
            sPerson = GetPCPublicCDKey(oPC);
        }

        // Если паблик совпадает с тэгом погибшего существа в первых 8 знаках слева, то продолжить
        if (GetStringLeft(sEnemy, 8) == sPerson)
        {
            // Удостовериться, что уровень персонажа ниже 4-го
            if (GetHitDice(oPC) < 4)
            {
                // Узнать опыт персонажа
                int nXP = GetXP(oPC);
                // Узнать уровень персонажа
                int nLevel = GetHitDice(oPC);
                // Прибавить к уровню 1
                int nHD = nLevel + 1;
                // Вычислить бонусный опыт
                int nMin = (50 * nHD);
                // Выдать бонусный опыт
                SetXP(oPC, nXP + nMin);
            }
            return;
        }
        // Найти следующего персонажа
        oPlayer = GetNextPC();
    }

    // Если ключ в положении 'TRUE', выполнить
    if (nCreature)
    {
        // Поиск первого существа в локации
        object oMonster = GetFirstObjectInArea(OBJECT_SELF);

        // Отфильтровать ненужные объекты, и заняться поиском существ
        if (GetObjectType(oMonster) == OBJECT_TYPE_CREATURE)
        // Удостовериться, что существо не подпадает под категорию нижеследующих
        if (!GetIsDM(oCreature) || !GetIsPC(oCreature) || !GetIsDMPossessed(oCreature))

        // Если существо есть, то продолжить
        while (GetIsObjectValid(oMonster))
        {
            // Если требуемое слово совпадает с правой частью тэга существа, то продолжить
            if (GetStringRight(GetTag(oMonster), 6) == "_enemy")
            {
                // Затереть все действия объекта
                AssignCommand(oMonster, ClearAllActions(TRUE));
                // Переключить функцию, чтобы можно было удалить существо
                AssignCommand(oMonster, SetIsDestroyable(TRUE, FALSE, FALSE));
                // Удалить существо
                DestroyObject(oMonster);
                // Удалить глобальную переменную Арены
                SetLocalInt(oMod, "WorkArena", FALSE);
            }
            // Поиск следующего существа в локации
            oMonster = GetNextObjectInArea(OBJECT_SELF);
        }
    }
}
dumbo
Zirrex, ты бы описал конкретнее, что ты хочешь сделать. из предыдущих обрывков фраз я, например, ничегошеньки не понял.

прошу пардона, но скрипт запутан, неоптимален и содержит ошибки. wacko.gif unknw.gif
Zirrex
dumbo, гм, ну что тут не ясного? На Арену входит персонаж, сражается со своей зеркальной копией, а в это время скрипт на хартбите локации постоянно проверяет, совпадают ли паблик персонажа и часть тэга копии персонажа. Если не совпадают, копия персонажа удаляется с Арены.

А проблема, которую я уже описал выше, проста. Когда на Арене больше 1 персонажа, то копия исчезает, потому что ключ 'nCreature' переключается на TRUE, даже если в этот момент на Арене присутствует персонаж, у которого совпадает паблик с тэгом своей копии.

Если уж ошибки в скрипте, то показал бы мне их, а то я с ним уже замучился.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.