Город Мастеров
IPB

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
5 страниц V  < 1 2 3 4 > »   
Ответить в эту темуОткрыть новую тему
> База скриптов, Готовые скрипты. Описание обязательно.
Aiwan
сообщение Jul 23 2004, 22:41
Сообщение #26


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Вот простенький скриптик, если НПС отойдет от своего POST_-а дальше 15 метров, то появится строка в диалоге.
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Copyright © 2004 WRG!
//:://////////////////////////////////////////////
/*
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 23.07.2004
//:://////////////////////////////////////////////

int StartingConditional()
{
    string sTag = ("POST_"+GetTag(OBJECT_SELF));
    object oWp = GetWaypointByTag(sTag);

    if (GetIsObjectValid(oWp) && GetDistanceBetween(oWp, OBJECT_SELF) > 15.0f)
        return TRUE;
    return FALSE;
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Valleo
сообщение Jul 25 2004, 18:31
Сообщение #27


Level 4
**

Класс: Друид
Характер: Neutral Evil
Раса: Эльф
NWN: Скриптинг [PW]



А вот скриптик, если при каких нибуть условиях вы не хотите, чтобы игрок рестился обычным методом через кнопку реста:

Neverwinter Script Source
object oPC = GetLastPCRested();
if(GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED)
  {
  SendMessageToPC(oPC,"Рест через кнопку реста отменен."); //Это можно и убрать
  AssignCommand(oPC, ClearAllActions());
  }
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Aug 12 2004, 20:15
Сообщение #28


Level 5
Иконки Групп

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



автор: _kaa_

Вот стандартный файл для алкоголя:
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: NW_S3_Alcohol.nss
//:: Copyright © 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
  Makes beverages fun.
  May 2002: Removed fortitude saves. Just instant intelligence loss
*/

//:://////////////////////////////////////////////
//:: Created By:   Brent
//:: Created On:   February 2002
//:://////////////////////////////////////////////

void DrinkIt(object oTarget)
{
   // AssignCommand(oTarget, ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK));
   AssignCommand(oTarget,ActionSpeakStringByStrRef(10499));
}

void MakeDrunk(object oTarget, int nPoints)
{
    if (Random(100) + 1 < 40)
        AssignCommand(oTarget, ActionPlayAnimation(ANIMATION_LOOPING_TALK_LAUGHING));
    else
        AssignCommand(oTarget, ActionPlayAnimation(ANIMATION_LOOPING_PAUSE_DRUNK));

    effect eDumb = EffectAbilityDecrease(ABILITY_INTELLIGENCE, nPoints);
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDumb, oTarget, 60.0);
//   AssignCommand(oTarget, SpeakString(IntToString(GetAbilityScore(oTarget,ABILITY_INTELLIGENCE))));
}
void main()
{
    object oTarget = GetSpellTargetObject();
   // SpeakString("here");
    // * Beer
    if (GetSpellId() == 406)
    {
        // *burp*
        //AssignCommand(oTarget, SpeakString("Beer"));
        DrinkIt(oTarget);
//        if (FortitudeSave(oTarget, d20()+10) == TRUE)
        {
            MakeDrunk(oTarget, 1);
        }
    }
    else
    // *Wine
    if (GetSpellId() == 407)
    {
        DrinkIt(oTarget);
//        if (FortitudeSave(oTarget, d20()+10 +2) == TRUE)
        {
            MakeDrunk(oTarget, 2);
        }
    }
    else
    // * Spirits
    if (GetSpellId() == 408)
    {
        DrinkIt(oTarget);
//        if (FortitudeSave(oTarget, d20()+10) == TRUE)
        {
            MakeDrunk(oTarget, 3);
        }
     }

}


Самый простой способ добавить что-то:

Так была реализованна отрава на Экзисе по заказу Илэссэ (IMG:style_emoticons/kolobok_light/smile.gif)
Обрабатывался тег бутылки. Последние цифры преобразовывались в задержку, после который выпивший эту гадость умирал, дрыгая ногами.

Neverwinter Script Source
object oItem = GetSpellCastItem();
    if (GetStringUpperCase(GetStringLeft(GetTag(oItem),13))=="AX_IT_POISON_"){
        float PoisonType = StringToFloat(GetStringRight(GetTag(oItem),GetStringLength(GetTag(oItem))-13));
        DelayCommand(PoisonType, ExecuteScript("lg_anim_death",oTarget));

Вот вызываемый скрипт смерти: `lg_anim_death`
Neverwinter Script Source
void main()
{
    AssignCommand(OBJECT_SELF,ClearAllActions());
    AssignCommand(OBJECT_SELF,ActionPlayAnimation(ANIMATION_LOOPING_SPASM));
    DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectKnockdown(),OBJECT_SELF,4.0));
    DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectDeath(TRUE),OBJECT_SELF));
    DelayCommand(4.0, SendMessageToPC(OBJECT_SELF,"Âàñ îòðàâèëè"));


Добавлено в [mergetime]1092332152[/mergetime]
<small>Добавлено в 17:26</small>
Шпаргалка Айвана по скриптам

Код

дело в том, что при

object oJamp = GetTransitionTarget(OBJECT_SELF);
if (GetIsPC(oPC))
{
AssignCommand(oPC, JumpToObject(oJamp));

НЕ ВСЕГДА МОЖЕТ ПРОИЗОЙТИ СКАЧОК
надо делать так:

string sJamp = GetTag(GetTransitionTarget(OBJECT_SELF));
....
JumpToObject(GetObjectByTag(sJamp));


************************************************
tag = mask + INtToString(Number);
mask = "WP_NPCTAG_"
Number = 1..12

*************************************************

DestroyObject(GetItemInSlot(INVENTORY_SLOT_CARMOR,oPC));

*************************************************
>    ЖУРНАЛЬНЫЕ ЗАПИСИ ПО КВЕСТОВЫМ ПРЕДМЕТАМ

object oItem=GetModuleItemAcquired();
if(GetTag(oItem)=="SEAMAGAZIN_PIRAT")
{
 if(GetLocalInt(oItem,"DO_ONCE")!=1 && GetItemPossessor(oItem) == GetFirstPC())
  {
 AddJournalQuestEntry("ANDRA_PIRATES", 4, GetFirstPC());
 SetLocalInt(oItem,"DO_ONCE",1);
  }
}

*****************************************************
> Увеличение числа переменной на единицу за раз.
SetLocalInt(объект_1, "переменная_1", GetLocalInt(объект_1, "переменная_1") + 1);

На кого ставится переменная?
объект_1 = OBJECT_SELF - если на сам триггер
            или
GetEnteringObject() - если на наступившего

********************************          
> Рандом на начало строки
int StartingConditional()
{

  // Add the randomness
  if(Random(100) >= 15)
      return FALSE;

  return TRUE;
}

*************************************************
> Дестрой нескольких объектов по одинаковому тэгу.
при СreateObject укажи новый тэг "new_tag"
а потом, когда условие соблюдено, делаешь так:
void main()
{
int i=0;
object oScelet = GetObjectByTag("new_tag",i);
while (oScelet!=OBJECT_INVALID)
 {
 DestroyObject(oScelet);
 i++;
 oScelet = GetObjectByTag("new_tag",i)
 }
}

****************************************************
> Проверка шмотки на игроке

if (GetTag(GetItemInSlot(INVENTORY_SLOT_CARMOUR,GetPCSpeaker())=="тэг нужной шмотки")

>***************************************
> ВХОД в локацию по проверке переменной
object oPC = GetEnteringObject();
object oDoor = GetObjectByTag("тэг_двери1"); // до затопления
if (!GetIsPC(oPC))
   return;
if (GetLocalInt(oPC, "FLOODED") == 1)
  oDoor = GetObjectByTag("тэг_двери2"); // после затопления
AssignCommand(oDoor, ActionOpenDoor(oDoor));
AssignCommand(oPC, JumpToObject(oDoor));

>***************************************
// Скрипт может стоять НА PC в диалоге!!!

void main()
{
object oPC = GetPCSpeaker();
object oItem = GetItemPossessedBy(oPC, "ZAVTRAK");
if (GetTag(oItem) == "ZAVTRAK")
{
 SpeakString("Смотри не лопни!");
 DestroyObject(oItem); // УБИВАЕТ ПРЕДМЕТ
}
else
{
 SpeakString("Ой! Да где же оно?");
}
}
>******************************************
// Скрипт должен стоять НА НЕПИСЕ!!!

void main()
{
object oPC = GetPCSpeaker();
object oItem = GetObjectByTag("ZAVTRAK");
if (GetTag(GetItemPossessedBy(oPC, "ZAVTRAK")) == "ZAVTRAK")
{
 SpeakString("Смотри не лопни!");
 ActionGiveItem(oItem, oPC);  // ОТДАЕТ ПРЕДМЕТ
}
else
{
 SpeakString("Ой! Да где же оно?");
}
}

>******************************************
void main()
{
object oPC = GetPCSpeaker();
object oItem = GetItemPossessedBy(oPC, "MINERS_PISMO");
object oNos = GetObjectByTag("SUPER_NOS_IN_MARKET");
AssignCommand (oNos, JumpToObject(GetObjectByTag("POISON_SUPER_NOS")));
if (GetTag(oItem) == "MINERS_PISMO")
{
 DestroyObject(oItem); // УБИВАЕТ ПРЕДМЕТ
 SpeakString("Отлично, Грэмм у нас в руках!");
}
}
>******************************************
> Дает вещь из палитры, а не из инвентаря
object oPC = GetFirstPC();
CreateItemOnObject("ResRef-вещи", oPC, число);

Последний параметр нужен только если ты даешь типа стрел или пуль...
короче количество в ячейке инвентаря. Само собой 2 меча ты дать
таким образом не сможешь :)...
>******************************************

<small>Добавлено в 17:29</small>
автор Valleo

Маленький скриптик для реализации болота:
Neverwinter Script Source
void StartBog()
{
object oBog = OBJECT_SELF;
object oArea = GetArea(oBog);
location lLocation = GetLocation(oBog);
location lLoc;
location lLocat;
object oObject = GetFirstObjectInShape(SHAPE_SPHERE,100.0,lLocation,FALSE,OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oObject))
{
lLoc = GetLocation(oObject);
lLocat = GetLocalLocation(oObject,"BOGLOC");
if(GetIsObjectValid(GetAreaFromLocation(lLocat)))
  {
  float fDist = GetDistanceBetweenLocations(lLoc,lLocat);
  if(fDist < 5.0)
   {
   effect eSlow = EffectMovementSpeedDecrease(75);
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSlow,oObject,70.0);
   FloatingTextStringOnCreature("Вас засасывает в бололто...",oObject,FALSE);
   }
  }
SetLocalLocation(oObject,"BOGLOC",lLoc);
oObject = GetNextObjectInShape(SHAPE_SPHERE,100.0,lLocation,FALSE,OBJECT_TYPE_CREATURE);
}
}
void main()
{
object oBog = OBJECT_SELF;
int iTimer = GetLocalInt(oBog,"TIMER");
if(iTimer <= 9)
{
iTimer = iTimer + 1;
SetLocalInt(oBog,"TIMER",iTimer);
return;
}
SetLocalInt(oBog,"TIMER",0);
StartBog();
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Aug 14 2004, 01:50
Сообщение #29


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Вот простой скриптик, ставится на строку НПС и во время длинного расказа, происходит, как бы временной интервал с потухшим экраном. Что то навроде, как в кино: "Прошло два года..." :?)

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Created By: WRG! Aiwan aiwan@e-mail.ru
//:: Created On: 21.12.2003
//:://////////////////////////////////////////////
/*
            ПАУЗА В РАЗГОВОРЕ С НПС
*/

//:://////////////////////////////////////////////
void main()
{
    object oPC = GetPCSpeaker();
    AssignCommand(OBJECT_SELF, ActionPauseConversation());
    AssignCommand(OBJECT_SELF, FadeToBlack(oPC, FADE_SPEED_SLOW));
    AssignCommand(OBJECT_SELF, ActionWait(4.0));
    AssignCommand(OBJECT_SELF, FadeFromBlack(oPC, FADE_SPEED_SLOW));
    SetTime(GetTimeHour()+(Random(4)), GetTimeMinute()+(Random(60)), 0, 0);
    AssignCommand(OBJECT_SELF, ActionResumeConversation());
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Twin
сообщение Oct 2 2004, 15:12
Сообщение #30


Level 5
**

Класс: Некромант
Характер: Neutral Evil
Раса: Нежить
NWN: Скриптинг [PW]



Благодаря советам вышестоящих модераторов в другом топике, я таки дописал респаунинг NPC по событию их смерти, без использования энкаунтеров. ;) Это может кому-нибудь пригодиться, т.к. нет проблемы с "пересечением" области энкаунтера игроком и т.п., NPC может появится прямо перед носом игрока.

Для работы скрипта нам потребуется создать плейс с тэгом PLC_AUTORESPAWN. Любой плейс, он нужен лишь для того, чтобы на него вешать DelayCommand. Лично я ставил этот плейс в "системную" локу 8x8, которая только для подобных целей и была создана. У меня не получилось повесить DelayCommand на вейпоинт, иначе бы плейс создавать и не потребовалось бы. ;)
Создаем новый файл скрипта, который будет инклюдится к событию смерти:

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Created By: Twin
//:: Communication:
//::  E-mail: twin_quad@hotmail.com
//::  IRC: Twin@irc.rinet.ru:6669
//::
//:: Created On: 2004.10
//:://////////////////////////////////////////////

void doSpawn(string sResRef, string sTag, location locWhere, int nRespawnTime, int nMaxSpawns, int nCurrent, int bAnimation);

void cycleSpawn(object oNPC)
{
    object oRespawner = GetObjectByTag("PLC_AUTORESPAWN");
    if ( !GetIsObjectValid(oRespawner) )
        return;

    int nRespawnTime = GetLocalInt(oNPC, "respawn_time");
    if ( nRespawnTime <= 0 )
        return;

    string sWaypoint = GetTag(oNPC);
    if ( FindSubString(sWaypoint, "NPC_") == 0 )
        sWaypoint = GetStringRight(sWaypoint, GetStringLength(sWaypoint) - 4);
    sWaypoint = "WPR_" + sWaypoint;

    int bAnimation = GetLocalInt(oNPC, "respawn_animation");
    int nMaxSpawns = GetLocalInt(oNPC, "respawn_max");
    int nCurrent  = GetLocalInt(oNPC, "respawn_current");
    if ( nCurrent == 0 )
        nCurrent = 1;

    if ( (nMaxSpawns <= 0 || nCurrent < nMaxSpawns) && GetIsObjectValid(GetObjectByTag(sWaypoint)) )
    {
        //SendMessageToPC(GetFirstPC(), "Next respawn in "+ IntToString(nRespawnTime) +" seconds.");
        //SendMessageToPC(GetFirstPC(), "Current/Max: "+ IntToString(nCurrent) +"/"+ IntToString(nMaxSpawns));

        string sResRef = GetResRef(oNPC);
        string sTag = GetTag(oNPC);
        location locWhere = GetLocation(GetObjectByTag(sWaypoint));

        AssignCommand(oRespawner,
            DelayCommand(IntToFloat(nRespawnTime),
                doSpawn(sResRef, sTag, locWhere, nRespawnTime, nMaxSpawns, nCurrent, bAnimation)
            )
        );
    }
}

void doSpawn(string sResRef, string sTag, location locWhere, int nRespawnTime, int nMaxSpawns, int nCurrent, int bAnimation)
{
    object oNPC;
    oNPC = CreateObject(OBJECT_TYPE_CREATURE, sResRef, locWhere, bAnimation, sTag);

    nCurrent++;
    SetLocalInt(oNPC, "respawn_time", nRespawnTime);
    SetLocalInt(oNPC, "respawn_max", nMaxSpawns);
    SetLocalInt(oNPC, "respawn_current", nCurrent);
    SetLocalInt(oNPC, "respawn_animation", bAnimation);

    //SendMessageToPC(GetFirstPC(), "doSpawn("+ sResRef +", "+ sTag +")");
}


Далее ставим на карту требуемого NPC, в скрипте OnDeath или UserDefined на событие 1007 (главное чтобы во время смерти срабатывало) в самом начале вставляем:
Neverwinter Script Source
#include "название созданного выше скрипта"


И где-нибудь ближе к концу скрипта смерти вставляем:
Neverwinter Script Source
cycleSpawn(OBJECT_SELF);


Настраивается это всё просто. Заходим в Variables созданного NPC и добавляем переменные (все типа int):
respawn_time - Количество секунд, через которое появится новый NPC.
respawn_max - Необязательный параметр. Максимальное количество респаунов NPC.
respawn_animation - Необязательный параметр. Проигрывать ли анимацию во время создания NPC [0/1].

Можно настраивать Variables прямо в синьке NPC, на эффект это не влияет.

Место где появится новый NPC определяется путём выставления вэйпоинтов с названием типа "WPR_"+ тэг_умершего_NPC. Если в начале тэга NPC стоит "NPC_", то эти четыре символа отрежутся.

Всё.

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

Надеюсь кому-нибудь пригодится. ;)

P.S. Забыл о вэйпоинтах написать... Исправлено.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Oct 9 2004, 18:51
Сообщение #31


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



Этот скрипт можно ставить на факел, фонарь, или луч света. Например факелы и фонари можно расставить по городу. А лучи света или магические брызги - к фонтанам. И когда в городе наступит ночь - зажгуться факелы и будут освещать территорию, а у фонтанов заработает подсветка. Скрипт ставит OnHB плейса. Не забудьте снять галочку Static.
Neverwinter Script Source
void main()
{
   object oSelf = OBJECT_SELF;
   if (GetIsDay()==FALSE && GetLocalInt(OBJECT_SELF,"on")!=1)
   {
   SetLocalInt(OBJECT_SELF,"on",1);
   PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
   effect eLight = EffectVisualEffect(VFX_DUR_LIGHT_YELLOW_10);
   ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLight, oSelf);
   }

   if (GetIsDay()==TRUE && GetLocalInt(OBJECT_SELF,"on")==1)
   {
   SetLocalInt(OBJECT_SELF,"on",0);
   PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE);
   effect eEffect = GetFirstEffect(oSelf);
   while (GetIsEffectValid(eEffect) == TRUE)
       {
       if (GetEffectType(eEffect) == EFFECT_TYPE_VISUALEFFECT)
          RemoveEffect(oSelf, eEffect);
          eEffect = GetNextEffect(oSelf);
       }
   }

}


Сообщение отредактировал Аваддон - Nov 9 2004, 22:36
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Oct 12 2004, 20:53
Сообщение #32


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



Скрипт получения уровня по алайменту написал [MoF]Darth_Nick. Там он использовал визуальные эффекты для разных алайментов. Я лишь добавил немного своего в этот скрипт. И так, получение лвла по алайменту а-ля горец :D
Neverwinter Script Source
void main()
{
object oPC = GetPCLevellingUp();

if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_EVIL)
{
SetCutsceneMode(oPC, TRUE);
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oPC), 8.0);
AssignCommand(oPC, PlayAnimation(ANIMATION_LOOPING_SPASM,1.0,5.0));
DelayCommand(1.0,AssignCommand(oPC,PlayVoiceChat(VOICE_CHAT_LAUGH)));
DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SUMMON_EPIC_UNDEAD), oPC));
DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HARM), oPC));
DelayCommand(4.0,AssignCommand(oPC, PlayAnimation(ANIMATION_LOOPING_DEAD_FRONT,1.0,10.0)));
DelayCommand(3.8,AssignCommand(oPC,PlayVoiceChat(VOICE_CHAT_DEATH)));
DelayCommand(5.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SLEEP), oPC));
DelayCommand(10.0,SetCutsceneMode(oPC, FALSE));
}
else if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_GOOD)
{
SetCutsceneMode(oPC, TRUE);
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oPC), 8.0);
AssignCommand(oPC, PlayAnimation(ANIMATION_LOOPING_SPASM,1.0,5.0));
DelayCommand(1.0,AssignCommand(oPC,PlayVoiceChat(VOICE_CHAT_NEARDEATH)));
DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HOLY_AID), oPC));
DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SUNBEAM), oPC));
DelayCommand(4.0,AssignCommand(oPC, PlayAnimation(ANIMATION_LOOPING_DEAD_FRONT,1.0,10.0)));
DelayCommand(3.8,AssignCommand(oPC,PlayVoiceChat(VOICE_CHAT_DEATH)));
DelayCommand(5.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SLEEP), oPC));
DelayCommand(10.0,SetCutsceneMode(oPC, FALSE));
}
else if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_NEUTRAL)
{
SetCutsceneMode(oPC, TRUE);
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oPC), 8.0);
AssignCommand(oPC, PlayAnimation(ANIMATION_LOOPING_SPASM,1.0,5.0));
DelayCommand(1.0,AssignCommand(oPC,PlayVoiceChat(VOICE_CHAT_NEARDEATH)));
DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SOUND_BURST), oPC));
DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HEALING_X), oPC));
DelayCommand(4.0,AssignCommand(oPC, PlayAnimation(ANIMATION_LOOPING_DEAD_FRONT,1.0,10.0)));
DelayCommand(3.8,AssignCommand(oPC,PlayVoiceChat(VOICE_CHAT_DEATH)));
DelayCommand(5.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SLEEP), oPC));
DelayCommand(10.0,SetCutsceneMode(oPC, FALSE));
}
}


Сообщение отредактировал Twin - Jan 8 2005, 06:00
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Oct 13 2004, 00:05
Сообщение #33


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



Ой, чето зачастил я со скриптами:) Но надеюсь пригодится :xz:
Этот скрипт на отдых. Для начала разберемся с условиями отдыха:

1. У игрока должна быть кроватка(подстилка) aka бэдролл
2. Так же должна быть в наличие еда.
3. Расстояние от разведенного костра должно быть не более 3х метров.
4. Если игрок спит в тяжелых доспехах (более 20 lbs) то у него есть риск заболеть, вредно ведь для здоровьица геройского. Но спасы рулят;) А если не рулят то придется переодеваться в пижамку (гы-гы :D )

Чтобы развести костер надо:
1. Найти дрова (сами запихнете их в какое нить дупло и т.п.)
2. Разложить дрова на земле.
3. Пожечь факелом.
4. Костер горит 180 сек (можете сами регулировать)
5. Если вы используете выложенные дрвоа без факела - игрок их поднимает, если с факелом - разводит костер.

Теперь с предметами:

Item'ы:
Подстилка - тэг [bedroll]
Еда - тэг [food]
Дрова - тэг [wood]

Placeable'ы:
Костер - синька [camp]
Подстилка (внешне выглядит как раскатаная из рулона ткань) - синька [place_bedroll]
Дрова (внешне выглядит как куча дров aka woodpile :D) - синька [place_wood] .

P.S. Синька это Blueprint ResRef

Со всех плейсов снимите галочку Static! А плейс Дрова должен быть Используемый.

Поехали...

Скрипт ставится на OnPlayerRest
Neverwinter Script Source
//////////////////////////////////////////////////
////////////Avaddon's Rest System//////////
////////// Script On Player Rest ////////////
////////// Date: 12.10.2004 ///////////////
//////// Created by: Avaddon ////////////
/////////////////////////////////////////////

#include "nw_i0_tool"
void main()
{
object oPC = GetLastPCRested();
object oCamp = GetNearestObjectByTag("camp",oPC);
object oBedroll = GetNearestObjectByTag("place_bedroll",oPC);
effect eSleep = EffectVisualEffect(VFX_IMP_SLEEP);
effect eBlind = EffectBlindness();
effect eDisease = EffectDisease(DISEASE_SOLDIER_SHAKES);

    if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED) //отдых начат
    {
        if(GetIsObjectValid(oCamp)!=TRUE) //проверка расстоЯниЯ до костра
        {
         FloatingTextStringOnCreature("Здесь слишком холодно",oPC,FALSE);
         AssignCommand(oPC,ClearAllActions()); //отмена отдыха
        }
       else
       {
       if(GetDistanceBetween(oPC,oCamp)>3.0)
       {
       FloatingTextStringOnCreature("Здесь слишком холодно",oPC,FALSE);
       AssignCommand(oPC,ClearAllActions()); //отмена отдыха
       }
       else
         {
        if (HasItem(oPC,"bedroll")==TRUE) //проверка на наличие подстилки
        {
            if (HasItem(oPC,"food")==TRUE) //проверка на наличие еды
            {
            ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSleep,oPC,30.0); // Эффект Z-z-z
            FadeToBlack(oPC, FADE_SPEED_SLOW); //тушим свет
            CreateObject(OBJECT_TYPE_PLACEABLE,"place_bedroll",GetLocation(oPC)); // Расстилаем подстилку
            DestroyObject(GetItemPossessedBy(oPC,"food")); //съедаем еду
            DestroyObject(GetItemPossessedBy(oPC,"bedroll")); //забираем у игрока подстилку из инвентори (реализм, блин)
            SetLocalInt(oPC,"slept",1); //сон удачен
            }
            else
            {
            FloatingTextStringOnCreature("Не боитесь помереть во сне от голода?!",oPC,FALSE);
            AssignCommand(oPC,ClearAllActions());
            }
        }
        else
        {
        FloatingTextStringOnCreature("Вам не на чем спать",oPC,FALSE);
        AssignCommand(oPC,ClearAllActions());
        }
       }
       }
    }
   if (GetLastRestEventType() == REST_EVENTTYPE_REST_FINISHED) //отдых закончен
   {
   FadeFromBlack(oPC, FADE_SPEED_SLOW); //продираем глазки
   DestroyObject(oBedroll); //убираем подстилку
   SetLocalInt(oPC,"slept",0); //отдых удачно окончен
   CreateItemOnObject("bedroll", oPC,1); // отдаем игроку в инвентори его подстилку
   if (GetWeight(GetItemInSlot(INVENTORY_SLOT_CHEST,oPC))>20) // проверка на вес брони
   {
   ApplyEffectToObject(DURATION_TYPE_INSTANT,eDisease,oPC); //игрок заболел
   }

   }

   if (GetLastRestEventType() == REST_EVENTTYPE_REST_CANCELLED) //отдых прерван
   {
   if(GetLocalInt(oPC,"slept")==1) //если отдых был прерван после того как он был успешно начат
   {
   FadeFromBlack(oPC, FADE_SPEED_FAST); //быстро продираем глазки
   DestroyObject(oBedroll); //убираем подстилку
   FloatingTextStringOnCreature("Вы проснулись от сильного шума, но глаза еще не привыкли к свету.",oPC,FALSE);
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSleep,oPC,10.0); //сонный игрок
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eBlind,oPC,10.0); //еще не проснулсЯ
   SetLocalInt(oPC,"slept",0); //успешный отдых прерван
   CreateItemOnObject("bedroll", oPC,1); // возвращаем в инвентори подстилку
   }
   }

}


Скрипт ставится на UnAcquireItem
Neverwinter Script Source
/////////////////////////////////////////
    //////////Avaddon's Rest System//////////
   ////// Script On UnAcquireItem //////////
  //////// Date: 12.10.2004 ///////////////
  //////// Created by: Avaddon ////////////
/////////////////////////////////////////
void main()
{
object oLost = GetModuleItemLost();
object oPC = GetModuleItemLostBy();
if (GetTag(oLost)=="wood")
{
CreateObject(OBJECT_TYPE_PLACEABLE,"place_wood",GetLocation(oPC)); //выкладываем плейс дров
DestroyObject(oLost); //уничтожаем выложенны мешочек с итемом дров
}
}


Скрипт ставится на On Used плейса дров
Neverwinter Script Source
/////////////////////////////////////////
    //////////Avaddon's Rest System//////////
   ////// Script On Used Woodpile //////////
  //////// Date: 12.10.2004 ///////////////
  //////// Created by: Avaddon ////////////
/////////////////////////////////////////
#include "nw_i0_tool"
void main()
{
object oPC = GetLastUsedBy();

    if (GetIsPC(oPC)==TRUE)
    {
    if (GetTag(GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC))=="NW_IT_TORCH001") //проверка - есть ли факел в руке
    {
    AssignCommand(oPC,PlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,2.0));
    CreateObject(OBJECT_TYPE_PLACEABLE,"camp",GetLocation(OBJECT_SELF),TRUE);// если есть - поджигаем костер
    DestroyObject(OBJECT_SELF); //убираем дрова
    }
    else
    {
    DestroyObject(OBJECT_SELF);
    CreateItemOnObject("wood",oPC,1); //если нет - игрок поднимает дрова
    }
}
}


Скрипт ставится на On Heartbeat костра
Neverwinter Script Source
/////////////////////////////////////////
    //////////Avaddon's Rest System//////////
   ////// Script On Heartbeat Campfire /////
  //////// Date: 12.10.2004 ///////////////
  //////// Created by: Avaddon ////////////
/////////////////////////////////////////

void main()
{
int iFire = GetLocalInt(OBJECT_SELF,"fire");

if (iFire<1)
{
SetLocalInt(OBJECT_SELF,"fire",6);
}
else
{
SetLocalInt(OBJECT_SELF,"fire",iFire+6);
}

if (iFire>180) //проверка - прошло ли более 180 секунд
{
DeleteLocalInt(OBJECT_SELF,"fire");
DestroyObject(OBJECT_SELF);
}
}


Эээ вроде ничего не напутал. Если что не получается - скажите, я поправлю.

Сообщение отредактировал Аваддон - Nov 13 2004, 16:51
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Nov 5 2004, 22:10
Сообщение #34


Level 5
Иконки Групп

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Источник: Валут.
Нашел: Авадон.

Neverwinter Script Source
// Make a large SoU bench usable by 3 creatures simultaneously
void main()
{
    // Set some variable for a beter understanding
    object oPlayer = GetLastUsedBy();
    object oBench = OBJECT_SELF;

    // Get a hold on the 3 pillows
    object oPillow1 = GetLocalObject( OBJECT_SELF, "Pillow 1" );
    object oPillow2 = GetLocalObject( OBJECT_SELF, "Pillow 2" );
    object oPillow3 = GetLocalObject( OBJECT_SELF, "Pillow 3" );

    // If "pillow 1" do not exist, create 3 of them and attach them to the bench
    if( !GetIsObjectValid( oPillow1 ) )
    {
        // Set up some variable for understanding
        object oArea = GetArea( oBench );
        vector locBench = GetPosition( oBench );
        float fOrient = GetFacing( oBench );

        // You can change the space between pillows changing this value
        float fSpace = 1.0f;

        // Calculate location of the 3 pillows
        location locPillow1 = Location( oArea, locBench + AngleToVector( fOrient + 90.0f ) * fSpace, fOrient );
        location locPillow2 = Location( oArea, locBench + AngleToVector( fOrient - 90.0f ) * fSpace, fOrient );
        location locPillow3 = Location( oArea, locBench, fOrient );

        // Create the 3 pillows
        oPillow1 = CreateObject( OBJECT_TYPE_PLACEABLE, "plc_invisobj", locPillow1 );
        oPillow2 = CreateObject( OBJECT_TYPE_PLACEABLE, "plc_invisobj", locPillow2 );
        oPillow3 = CreateObject( OBJECT_TYPE_PLACEABLE, "plc_invisobj", locPillow3 );
   
        // "attach" the pillows to the bench
        SetLocalObject( OBJECT_SELF, "Pillow 1", oPillow1 );
        SetLocalObject( OBJECT_SELF, "Pillow 2", oPillow2 );
        SetLocalObject( OBJECT_SELF, "Pillow 3", oPillow3 );
    }
   
    // Get a hold on the nearest invisible object, (maybe a pillow)
    int iDistance = 1;
    object oPillow = GetNearestObjectByTag( "InvisibleObject", oPlayer, iDistance );
   
    // while we find invisible object and that we did not check the 3 linked pillows
    int iCount = 0;
    while( GetIsObjectValid( oPillow ) || iCount < 3 )
    {
        // if it is one of the three pillow linked the the bench
        if( oPillow == oPillow1 || oPillow == oPillow2 || oPillow == oPillow3 )
        {
            iCount = iCount + 1 ;
            // If available
            if( !GetIsObjectValid( GetSittingCreature( oPillow ) ) )
            {
                // Sit and quit the script
                AssignCommand( oPlayer, ActionSit( oPillow ) );
                return;
            }
        }
        // Get the next nearest invisible object
        iDistance = iDistance + 1;
        oPillow = GetNearestObjectByTag( "InvisibleObject", oPlayer, iDistance );
    }
}

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Nov 17 2004, 22:29
Сообщение #35


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



Я тут написал пару скриптиков. Они для сервера использующего APS/NWNX 2 + MySQL.
Естественно писал для своих нужд, но может кому и пригодится.
Главная его цель - информативность.
Если вы умеете работатьс MySQL то польза от него будет большая. Он регистрирует персонажей. Потом просмтривая БД вы можете узнать сколько:
-Игроков зарегистрированно
-ДМов зарегистрированно
-Персонажей на одном аккаунте
-Персонажей на одном IP
-Персонажей на одном CD-Key
-Аккаунтов на одном IP
-Аккаунтов на одном CD-Key
-Сколько персонажей определенной расы на шарде
-Сколько персонажей определенной под-расы на шарде
-Сколько персонажей поклоняются определнному одинаковому божеству, и поклоняются ли вообще
-Сколько персонажей мужских, а сколько женских.
-Дату создания персонажа.
-ну и еще что-нибудь если забыл.
Да, если кто нибудь напишет PHP форму для статистики читающую из этой БД - это будет замечательно - тогда срочно свяжитесь со мной:)

Скрипты:

Скрипт aps_include поставляется в erf архиве вместе с APS/NWNX 2.

Скрипт на OnModuleLoad:

Neverwinter Script Source
#include "aps_include"
void main()
{
SQLInit();
string sSQL="CREATE TABLE `reg_data` ("+
"  `status` varchar(64) NOT NULL default '',"+
"  `login` varchar(64) NOT NULL default '',"+
"  `name` varchar(64) NOT NULL default '',"+
"  `gender` char(1) NOT NULL default '',"+
"  `race` varchar(100) NOT NULL default '',"+
"  `sub_race` varchar(100) NOT NULL default '',"+
"  `deity` varchar(100) NOT NULL default '',"+
"  `cd_key` varchar(64) NOT NULL default '',"+
"  `ip` varchar(25) NOT NULL default '',"+
"  `creation_date` datetime NOT NULL default '0000-00-00 00:00:00',"+
") TYPE=MyISAM;";


  SQLExecDirect("DESCRIBE reg_data");
  //Если таблицы нет - создаем ее
  if (SQLFetch()!= SQL_SUCCESS)
  {
    SQLExecDirect(sSQL);
  }
}


Скрипт на OnClientEnter:
Neverwinter Script Source
#include "aps_include"
void main()
{
object oPC=GetEnteringObject();
string sName=SQLEncodeSpecialChars(GetName(oPC));//ИМЯ персонажа
string sLogin=SQLEncodeSpecialChars(GetPCPlayerName(oPC)); // Логин игрока
string sGender="М"; if(GetGender(oPC)==GENDER_FEMALE)sGender="Ж";//Пол
string sKey=GetPCPublicCDKey(oPC); //CD-key игрока
string sIp=GetPCIPAddress(oPC); //Ip игрока
string sDeity=GetDeity(oPC); //Божество игрока
string sStatus = "PC";////ДМ или Игрок
if (GetIsDM(oPC)==TRUE)sStatus = "DM";
string sRace = "Неизвестно"; //Расы заносимые при регистрации в БД
if(GetRacialType(oPC)==RACIAL_TYPE_DWARF)sRace = "Дворф";
if(GetRacialType(oPC)==RACIAL_TYPE_ELF)sRace = "Эльф";
if(GetRacialType(oPC)==RACIAL_TYPE_GNOME)sRace = "Гном";
if(GetRacialType(oPC)==RACIAL_TYPE_HALFELF)sRace = "Полуэльф";
if(GetRacialType(oPC)==RACIAL_TYPE_HALFLING)sRace = "Полурослик";
if(GetRacialType(oPC)==RACIAL_TYPE_HALFORC)sRace = "Полуорк";
if(GetRacialType(oPC)==RACIAL_TYPE_HUMAN)sRace = "Человек";
string sSubrace=GetStringLeft(GetSubRace(oPC), 99);


//Выполним запрос SQL - выбираем строчку со статусом где логин и чар-нейм = логин и ИМЯ персонажа вошедшего игрока
string sSelect = "SELECT cd_key FROM `reg_data` WHERE login='"+GetPCPlayerName(oPC)+
"' AND name='" +GetName(oPC)+ "' AND status='"+sStatus+"'";

//Регистрируем игрока статус - регистред, логин, чар-нейм, пол, раса, подраса, сд-кей, ip, и дата регистрации
string sReg="INSERT INTO reg_data (status, login, name, gender,"+
       "race,sub_race, deity,cd_key,ip,creation_date) "+
       "VALUES('"+sStatus+
      "','"+sLogin+
      "','"+sName+
      "','"+sGender+
      "','"+sRace+
      "','"+sSubrace+
      "','"+sDeity+
      "','"+sKey+
      "','"+sIp+
      "',NOW())";

//Проверка на статус игрока (зарегистрирован или нет)
SQLExecDirect(sSelect);
if (SQLFirstRow() == SQL_SUCCESS)
    {
    SendMessageToPC(oPC,"Рады вас видеть снова!");

    }
    else
    {
        SQLExecDirect(sReg);
        SendMessageToPC(oPC,"Приветствуем Вас! Вас персонаж был автоматически зарегистрирован!");
    }
}


Сообщение отредактировал Аваддон - Nov 18 2004, 07:26
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
[MoF]Darth_Nick
сообщение Nov 18 2004, 05:38
Сообщение #36


Level 6
Иконки Групп

Класс: Некромант
Характер: Chaotic Evil
Раса: Нежить
NWN: Скриптинг [PW]



Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Name: Наитупейшая Ловушка
//:://////////////////////////////////////////////
/*
Скрипт ставится на OnEnter тригера(Generic)...
Описание - Из названия всё понятно :)
*/

//:://////////////////////////////////////////////
//:: Created By: [MoF]Darth_Nick
//:://////////////////////////////////////////////

void main()
{
object oPC = GetEnteringObject();
effect eBall = EffectVisualEffect(VFX_FNF_FIREBALL);

if (GetIsPC(oPC) && GetCurrentHitPoints(oPC) <= 70)
{
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eBall, oPC));
DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oPC));
}
else if (GetIsPC(oPC) && GetCurrentHitPoints(oPC) > 70)
{
FloatingTextStringOnCreature("Heh...This trick is not for me!", oPC);
}
}


дык...

Сообщение отредактировал DBColl - Nov 19 2004, 12:16
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Лито
сообщение Nov 22 2004, 10:49
Сообщение #37


Level 9
***

Класс: Страж Тьмы
Характер: Chaotic Evil
Раса: Нежить



у меня вот такий скрипт на OnPlayerDeath
CODE
void main()
{
object oPlayer = GetLastPlayerDied();
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), GetLocation(oPlayer));

DelayCommand(6.0,AssignCommand(oPlayer,ClearAllActions()));
DelayCommand(2.5, PopUpGUIPanel(oPlayer,GUI_PANEL_PLAYER_DEATH));
}


Чтобы всплывало окошко нужна например такая строка
CODE
DelayCommand(2.5, PopUpGUIPanel(oPlayer,GUI_PANEL_PLAYER_DEATH));


А для снятия экспы можно использовать этот стандартный скрипт :yes:
CODE
#include "nw_i0_plot"
void ApplyPenalty(object oDead)
{
   int nXP = GetXP(oDead);
   int nPenalty = 100 * GetHitDice(oDead);
   int nHD = GetHitDice(oDead);
   // * You can not lose a level with this respawning
   int nMin = ((nHD * (nHD - 1)) / 2) * 1000;

   int nNewXP = nXP - nPenalty;
   if (nNewXP < nMin)
      nNewXP = nMin;
   SetXP(oDead, nNewXP);
   int nGoldToTake =    FloatToInt(0.10 * GetGold(oDead));
   // * a cap of 10 000gp taken from you
   if (nGoldToTake > 10000)
   {
       nGoldToTake = 10000;
   }
   AssignCommand(oDead, TakeGoldFromCreature(nGoldToTake, oDead, TRUE));
   DelayCommand(4.0, FloatingTextStrRefOnCreature(58299, oDead, FALSE));
   DelayCommand(4.8, FloatingTextStrRefOnCreature(58300, oDead, FALSE));

}
void main()
{
   object oRespawner = GetLastRespawnButtonPresser();
   AssignCommand(oRespawner,JumpToLocation(GetLocation(GetObjectByTag("WP_RAISE"))));
   ApplyPenalty(oRespawner);
   ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oRespawner);
   ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oRespawner)), oRespawner);
   RemoveEffects(oRespawner);
}

Я его немножко изменил...не знаю насколько хорошо, но все пашет :good:

Сообщение отредактировал Лито - Nov 22 2004, 10:53
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
[MoF]Darth_Nick
сообщение Nov 24 2004, 04:57
Сообщение #38


Level 6
Иконки Групп

Класс: Некромант
Характер: Chaotic Evil
Раса: Нежить
NWN: Скриптинг [PW]



Я смерть плеера в БД записываю :)
Neverwinter Script Source
#include "aps_include"
void main()
{
object oPC = GetLastPlayerDied();
string sDeath = "UPDATE `reg_data` SET death=1 WHERE name='" + GetName(oPC) + "'";
string sDHelp = "Вы умерли, но можете воскреснуть!";
PopUpDeathGUIPanel(oPC, TRUE, TRUE, 1, sDHelp);
SQLExecDirect(sDeath);
}

Чуть изменил скрипты Аваддона...

Аваддон ты мог отредактировать скрипт и записывать еще лвлы туды :)
Вопрос 1: как можно изменить хелсы ПС на те которые я хочу сам, через скрипты?
Добавлено в [mergetime]1101261601[/mergetime]
П.С. у мя снятие экспы на OnRespawn ставится :) и золото не отбираю, ибо не жадный :lol: :lol:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Ilharess
сообщение Nov 24 2004, 12:40
Сообщение #39


Level 2
*

Класс: Клерик
Характер: Neutral Evil
Раса: Эльф



Спаунер/анспаунер для гвардов (Утром открывается дверь и появляется гвард идет на свой пост или свои вэйпы, несет службу весь день или ночь, когда приходит время идет обратно к двери если у него есть ключ то открывает ее, если нет то стучит и ему открывают, можно использовать и для спауна и обычных нпсов, если не много изменить :D ).
В вараблах двери создаем переменные
DAYTIMEGUARD string “resref npc”, если гвард не нужен то ""
NIGHTTIMEGUARD string “resref npc”, если гвард не нужен то ""
GATESGUARD string “resref npc”, если гвард не нужен то ""
На onhb двери вешаем :
Neverwinter Script Source
/*
  door_guardspaw_5
  Spawner for guards.
*/

//#include "kv_tools"
void main()
{
//--
string sDaytimeGuard = "MOB_DAYTIMEGUARD" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
object oDaytimeGuard = GetObjectByTag(sDaytimeGuard);
//--
string sNighttimeGuard = "MOB_NIGHTTIME" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
object oNighttimeGuard = GetObjectByTag(sNighttimeGuard);
//--
string sGatesGuard = "MOB_GATESGUARD" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
object oGatesGuard = GetObjectByTag(sGatesGuard);
//--Spawn day guard--//
if ( GetIsDay() && !GetIsObjectValid(oDaytimeGuard) && GetLocalString(OBJECT_SELF, "DAYTIMEGUARD") != "")

   {
     ActionOpenDoor(OBJECT_SELF);
     object oNewGuard = CreateObject(OBJECT_TYPE_CREATURE, GetLocalString(OBJECT_SELF, "DAYTIMEGUARD"), GetLocation(OBJECT_SELF), 0, sDaytimeGuard);

      /* if (GetIsObjectValid(oNewGuard))
         {
          DebugMessage(GetTag(OBJECT_SELF) + ": Guard " + sDaytimeGuard + " spawned sucsesfull");
         }*/

//--Spawn Night Guard--//
   }  else if ( GetIsNight() && !GetIsObjectValid(oNighttimeGuard) && GetLocalString(OBJECT_SELF, "NIGHTTIMEGUARD") != "")
             {
               ActionOpenDoor(OBJECT_SELF);
               object oNewGuard = CreateObject(OBJECT_TYPE_CREATURE, GetLocalString(OBJECT_SELF, "NIGHTTIMEGUARD"), GetLocation(OBJECT_SELF), 0, sNighttimeGuard);

              /*   if (GetIsObjectValid(oNewGuard))
                   {
                    DebugMessage(GetTag(OBJECT_SELF) + ": Guard " + sNighttimeGuard + " spawned sucsesfull");
                   }*/

//--Spawn Gate Guard--//
             } else if ( GetIsDusk() && !GetIsObjectValid(oGatesGuard) && GetLocalString(OBJECT_SELF, "GATESGUARD") != "")
                     {
                      ActionOpenDoor(OBJECT_SELF);
                      object oNewGuard = CreateObject(OBJECT_TYPE_CREATURE, GetLocalString(OBJECT_SELF, "GATESGUARD"), GetLocation(OBJECT_SELF), 0, sGatesGuard);
                   /*if (GetIsObjectValid(oNewGuard))
                       {
                        DebugMessage(GetTag(OBJECT_SELF) + ": Guard " + sGatesGuard + " spawned sucsesfull");
                       }*/

                     }
//--
if (GetIsNight() && GetIsObjectValid(oDaytimeGuard))
{
   SignalEvent(oDaytimeGuard,  EventUserDefined(111));//TIME TO GO HOME:)
   SetLocalObject(GetArea(OBJECT_SELF), "THE_DOOR", OBJECT_SELF);
}
else if (GetIsDay() && GetIsObjectValid(oNighttimeGuard))
       {
        SignalEvent(oNighttimeGuard,  EventUserDefined(111));//TIME TO GO HOME:)
        SetLocalObject(GetArea(OBJECT_SELF), "THE_DOOR", OBJECT_SELF);
       }
       else if (GetIsDawn() && GetIsObjectValid(oGatesGuard))
             {
              SignalEvent(oGatesGuard,  EventUserDefined(111));//TIME TO GO HOME:)
              SetLocalObject(GetArea(OBJECT_SELF), "THE_DOOR", OBJECT_SELF);
             }
}


На onopen
Neverwinter Script Source
/*
door_guardspaw_8
Spawner for guards.
*/


void main()
{

DelayCommand(5.0, ActionCloseDoor(OBJECT_SELF));
SetLocked(OBJECT_SELF, TRUE);
//--
object oClicker = GetLastOpenedBy();
if ( GetIsPC(oClicker)) return;
//--
string sDaytimeGuard = "MOB_DAYTIMEGUARD" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
//--
string sNighttimeGuard = "MOB_NIGHTTIME" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
//--
string sGatesGuard = "MOB_GATESGUARD" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
//--
if (GetTag(oClicker) == sDaytimeGuard || GetTag(oClicker) == sNighttimeGuard || GetTag(oClicker) == sGatesGuard)
   {
     DelayCommand(1.0, DestroyObject(oClicker));
   }

}



На onfailtoopen
Neverwinter Script Source
/*
door_guardspaw_4
Spawner for guards.
*/


void main()
{
//--
object oClicker = GetClickingObject();
if (GetIsPC(oClicker)) return;
//--
string sDaytimeGuard = "MOB_DAYTIMEGUARD" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
//--
string sNighttimeGuard = "MOB_NIGHTTIME" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
//--
string sGatesGuard = "MOB_GATESGUARD" + GetSubString(GetTag(OBJECT_SELF), 4, GetStringLength(GetTag(OBJECT_SELF)));
//--
if (GetTag(oClicker) == sDaytimeGuard || GetTag(oClicker) == sNighttimeGuard || GetTag(oClicker) == sGatesGuard)
   {

     AssignCommand(oClicker, SpeakString("*Ñòó÷èò â äâåðü*"));
     DelayCommand(1.0, ActionOpenDoor(OBJECT_SELF));
     DelayCommand(1.5, DestroyObject(oClicker));

   }

}


В userdef нпса добавлете:
Neverwinter Script Source
//--стандартный ondef код--//
............................................
else if (nUser == 111//TIME TO GO HOME:)
    {

      if ( !GetIsInCombat() || GetCurrentAction() != ACTION_DIALOGOBJECT)
        {
          ClearAllActions();
          ActionMoveToObject(GetLocalObject(GetArea(OBJECT_SELF), "THE_DOOR"));
          ActionOpenDoor(GetLocalObject(GetArea(OBJECT_SELF), "THE_DOOR"));
        }
    }


ЗЫ мой первый нвн скрипт так что если это тупо не смейтесь:)
Чуть не забыл:) Дверь должна иметь тэг DOOR_7 символов (индификатор спаунера)

Сообщение отредактировал Ilharess - Nov 24 2004, 12:56
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Nov 27 2004, 12:29
Сообщение #40


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



долго отсутствовал, с интернетом опять неприятности были....

QUOTE (baskan @ Nov 20 2004, 17:26)
Вопрос насчет скрипта смерти Аваддона, на 1странице
Вопрос: Что нужно дописать, чтобы PC не сразу попадал в фугу, а перед этим всплывало окошко, и что дописать, что экспа снималась? А так ваще скрипт супер!

Вот, Лито меня выручил. И так все объяснил:)

QUOTE ([MoF)
Darth_Nick, Nov 24 2004, 04:57]
Вопрос 1: как можно изменить хелсы ПС на те которые я хочу сам, через скрипты?

Хэлсы всмысле возможность максимальных хэлсов или вообще просто там сделать что у перса стало 2- хэлсов?
Тогда это надо сделать так:

int iMax = Берешь Максимальные Хит-Поинты перса;
int iValue = 20 ;//сколько хочешь хит-поинтов сделать персу
int iDiff=iMax-iSet; //разница между максимальными хит-поинтами и теми которые ты хочешь установить
int iSet = iMax-iDiff;

А затем просто выполняешь команду Магическое Повреждение (iSet) на PC
В это случае у игрока станет 20 хит поинтов.

QUOTE ([MoF)
Darth_Nick, Nov 24 2004, 04:57]
Я смерть плеера в БД записываю
Чуть изменил скрипты Аваддона...
Аваддон ты мог отредактировать скрипт и записывать еще лвлы туды


Няя...а зачем? Я этот скрипт делал как Регистрационный. А ты вероятно хочешь статистику сервера сделать? Тогда погоди немного... Я тут пишу одну системку, чтобы игроку надо было своего персонажа регистрировать через Web интерфейс:) Во первых это поможет отследить чтобы игроки не создавали себе кучу игроков, а во вторых, незарегистрированных лично на сайте шарда - пускать на сервер не будет.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Nov 29 2004, 09:35
Сообщение #41


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



На ваульте полно Сервер-статус-чекеров, но они берут инфу когда снифят трафик от сервака к серверу Bioware. В нашем НВН сервере есть такая галочка "Post game to Inernet", которую самому поставить нельзя, а если интернет у сервера не доступен (например, в локальной сети) то, это галочка убирается, траффик от сервера не передается, и следовательно все PHP скрипты для статуса, не работают.
Но у меня появилась идея сделать статус сервера с помощью APS/NWNX2 и базы данных MySQL. [MoF]Darth_Nick написал еще для нее PHP скрипт который будет брать данные из MySQL.

Статус позволяет видеть:

- Количество игроков на сервере
- Их имена (зачем MoF]Darth_Nick'у нужны аккаунты - понятия не имею, но я чуть модифицировал его скрипт - если вам нужны аккаунты см. в теме "Статус Сервера через PHP страницу"
Итак, для начала мои скрипты:
- Пол
- Раса и Подраса
- Уровень
- Классы и уровень каждого класса
- PC или DM

Теперь скрипты:

OnModuleLoad

Neverwinter Script Source
/*
////////////////////////////////
//////Created By: Avaddon//////
//////Date: 28. 11. 2004//////
/////////////////////////////
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\MYSQL SERVER STATUS\\\\\\\
\\\\\\Put this script:\\\\\\\\\
\\\\\\\"OnModuleLoad"\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
*/

#include "aps_include"
void main()
{
//СтандартаЯ команда в "aps_onload"
SQLInit();

//Команда MySQL "Создать таблицу REG_DATA"
string sSQL="CREATE TABLE `reg_data` ("+
"  `pc_dm` varchar(64) NOT NULL default '',"+
"  `login` varchar(64) NOT NULL default '',"+
"  `name` varchar(64) NOT NULL default '',"+
"  `gender` varchar(10) NOT NULL default '',"+
"  `race` varchar(64) NOT NULL default '',"+
"  `sub_race` varchar(100) NOT NULL default '',"+
"  `levels` varchar(3) NOT NULL default '',"+
"  `class_1` varchar(64) NOT NULL default '',"+
"  `class_2` varchar(64) NOT NULL default '',"+
"  `class_3` varchar(64) NOT NULL default '',"+
"  `deity` varchar(100) NOT NULL default '',"+
"  `cd_key` varchar(64) NOT NULL default '',"+
"  `ip` varchar(25) NOT NULL default '',"+
"  `line_status`  varchar(4) NOT NULL default '',"+
"  `creation_date` datetime NOT NULL default '0000-00-00 00:00:00',"+
") TYPE=MyISAM;";

/*Команда MySQL "Выставить line_status" на "off", везде где он = "on".
ИспользуетсЯ при загрузке модулЯ длЯ обновлениЯ статистики после краша
или выключениЯ сервера. */

string sOffline = "UPDATE `reg_data` SET line_status = 'off' WHERE line_status='on'";

  //ПроверЯем есть ли таблица REG_DATA
  SQLExecDirect("DESCRIBE reg_data");

  //Если таблицы нет - создаем ее
  if (SQLFetch()!= SQL_SUCCESS)
  {
    SQLExecDirect(sSQL);
  }
  //При загрузке модулЯ всем выставлЯем статус "Offline"
  SQLExecDirect(sOffline);
}



OnClientEnter

Neverwinter Script Source
/*
////////////////////////////////
//////Created By: Avaddon//////
//////Date: 28. 11. 2004//////
/////////////////////////////
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\MYSQL SERVER STATUS\\\\\\\
\\\\\\Put this script:\\\\\\\\\
\\\\\\\"OnClentEnter"\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
*/

#include "aps_include"
void main()
{
object oPC=GetEnteringObject();
string sName=SQLEncodeSpecialChars(GetName(oPC));//ИМЯ персонажа
string sLogin=SQLEncodeSpecialChars(GetPCPlayerName(oPC)); // Логин игрока
string sGender="Мужской"; if(GetGender(oPC)==GENDER_FEMALE)sGender="Женский";//Пол
string sKey=GetPCPublicCDKey(oPC); //CD-key игрока
string sIp=GetPCIPAddress(oPC); //Ip игрока
string sDeity=GetDeity(oPC); //Божество игрока
string sPC_DM = "PC"; if (GetIsDM(oPC)==TRUE)sPC_DM = "DM";////ДМ или Игрок
string sSubrace=GetStringLeft(GetSubRace(oPC), 99);//Подраса игрока
string sAllLevels = IntToString(GetHitDice(oPC));
//Расы заносимые при регистрации в БД////////////////////////
string sRace;                                              //
int iRace = GetRacialType(oPC);                            //
switch (iRace)                                            //
    {                                                      //
    case RACIAL_TYPE_DWARF:                                //
    sRace = "Дворф";                                      //
    break;                                                //
                                                          //
    case RACIAL_TYPE_ELF:                                  //
    sRace = "Эльф";                                        //
    break;                                                //
                                                          //
    case RACIAL_TYPE_GNOME:                                //
    sRace = "Гном";                                        //
    break;                                                //
                                                          //
    case RACIAL_TYPE_HALFELF:                              //
    sRace = "Полуэльф";                                    //
    break;                                                //
                                                          //
    case RACIAL_TYPE_HALFLING:                            //
    sRace = "Полурослик";                                  //
    break;                                                //
                                                          //
    case RACIAL_TYPE_HALFORC:                              //
    sRace = "Полуорк";                                    //
    break;                                                //
                                                          //
    case RACIAL_TYPE_HUMAN:                                //
    sRace = "Человек";                                    //
    break;                                                //
    }                                                      //
/////////////////////////////////////////////////////////////


//Классы игрока///////////////////////////////////////////
int iNum;                                  //
for (iNum=0; iNum<4; iNum++)
{
string sClass;                                          //
int iClass = GetClassByPosition(iNum,oPC);              //
switch (iClass)                                        //
    {                                                  //
    case CLASS_TYPE_ARCANE_ARCHER:                      //
    sClass = "Тайный Стрелок";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_ASSASSIN:                          //
    sClass = "Убийца";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_BARBARIAN:                          //
    sClass = "Варвар";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_BARD:                              //
    sClass = "Бард";                                    //
    break;                                              //
                                                        //
    case CLASS_TYPE_BLACKGUARD:                        //
    sClass = "Страж Тьмы";                              //
    break;                                              //
                                                        //
    case CLASS_TYPE_CLERIC:                            //
    sClass = "Клирик";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_DIVINECHAMPION:                    //
    sClass = "Чемпион Торма";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_DRAGONDISCIPLE:                    //
    sClass = "Ученик Дракона";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_DRUID:                              //
    sClass = "Друид";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_DWARVENDEFENDER:                    //
    sClass = "Защитник Дворфов";                        //
    break;                                              //
                                                        //
    case CLASS_TYPE_FIGHTER:                            //
    sClass = "Воин";                                    //
    break;                                              //
                                                        //
    case CLASS_TYPE_HARPER:                            //
    sClass = "Разведчик Арфистов";                      //
    break;                                              //
                                                        //
    case CLASS_TYPE_INVALID:                            //
    sClass = " - ";                      //
    break;                                              //
                                                        //
    case CLASS_TYPE_MONK:                              //
    sClass = "Монах";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_PALADIN:                            //
    sClass = "Паладин";                                //
    break;                                              //
                                                        //
    case CLASS_TYPE_PALEMASTER:                        //
    sClass = "Бледный Мастер";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_RANGER:                            //
    sClass = "Следопыт";                                //
    break;                                              //
                                                        //
    case CLASS_TYPE_ROGUE:                              //
    sClass = "Плут";                                    //
    break;                                              //
                                                        //
    case CLASS_TYPE_SHADOWDANCER:                      //
    sClass = "Танцор Тени";                            //
    break;                                              //
                                                        //
    case CLASS_TYPE_SHIFTER:                            //
    sClass = "Оборотень";                              //
    break;                                              //
                                                        //
    case CLASS_TYPE_SORCERER:                          //
    sClass = "Волшебник";                              //
    break;                                              //
                                                        //
    case CLASS_TYPE_WEAPON_MASTER:                      //
    sClass = "Мастер Оружий";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_WIZARD:                            //
    sClass = "Маг";                                    //
    break;                                              //
    }                                                  //
//////////////////////////////////////////////////////////

//Берем класс данной позиции и заносим его в локальную строку
SetLocalString(oPC,"Class"+IntToString(iNum),sClass);//
//Берем уровень данного класса и заносим его в локальную строку
SetLocalString(oPC,"Level"+IntToString(iNum),IntToString(GetLevelByPosition(iNum,oPC)));//;
}
//Читаем уровни 1,2, и 3  класса
string sLevel1 = GetLocalString(oPC,"Level1");
string sLevel2 = GetLocalString(oPC,"Level2");
string sLevel3 = GetLocalString(oPC,"Level3");

//Читаем 1,2, и 3  класс
string sClass_1 = GetLocalString(oPC,"Class1")+" ("+sLevel1+")";
string sClass_2 = GetLocalString(oPC,"Class2")+" ("+sLevel2+")";
string sClass_3 = GetLocalString(oPC,"Class3")+" ("+sLevel3+")";


//Выполним запрос SQL - выбираем строчку где логин и чар-нейм = логин и ИМЯ персонажа вошедшего игрока
string sSelect = "SELECT * FROM `reg_data` WHERE login='"+GetPCPlayerName(oPC)+
"' AND name='" +GetName(oPC)+ "' AND pc_dm='"+sPC_DM+"'";

//Команда MySQL "Выставить вощдшему игроку статус OnLine"
string sLine_Status = "UPDATE `reg_data` SET line_status = 'on' WHERE login='"+GetPCPlayerName(oPC)+
"' AND name='" +GetName(oPC)+ "' AND pc_dm='"+sPC_DM+"'";

//Регистрируем игрока статус - регистред, логин, чар-нейм, пол, раса, классы (1,2,3), подраса, сд-кей, ip, и дата регистрации
string sReg="INSERT INTO reg_data (pc_dm, login, name, gender,"+
      "race, sub_race,levels, class_1,class_2,class_3, deity,cd_key,ip,line_status,creation_date) "+
      "VALUES('"+sPC_DM+
      "','"+sLogin+
      "','"+sName+
      "','"+sGender+
      "','"+sRace+
      "','"+sSubrace+
      "','"+sAllLevels+
      "','"+sClass_1+
      "','"+sClass_2+
      "','"+sClass_3+
      "','"+sDeity+
      "','"+sKey+
      "','"+sIp+
      "','on',NOW())";

//Проверка на статус игрока (зарегистрирован или нет)
SQLExecDirect(sSelect);
if (SQLFirstRow() == SQL_SUCCESS)
    {
    SendMessageToPC(oPC,"Статус изменен на [On Line]");
    //Если да - просто изменЯем статус на OnLine
    SQLExecDirect(sLine_Status);
    }
    else
    {
    //Если нет - регистрируем, и выставлЯем статус OnLine
        SQLExecDirect(sReg);
        SendMessageToPC(oPC,"Приветствуем Вас! Вас персонаж был автоматически зарегистрирован!");
        SendMessageToPC(oPC,"Статус изменен на [On Line]");
    }

//Задаем локальные строки игроку с его логином и именем
SetLocalString(oPC,"Login",GetPCPlayerName(oPC));
SetLocalString(oPC,"Name",GetName(oPC));
}



OnClientLeave

Neverwinter Script Source
/*
////////////////////////////////
//////Created By: Avaddon//////
//////Date: 28. 11. 2004//////
/////////////////////////////
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\MYSQL SERVER STATUS\\\\\\\
\\\\\\Put this script:\\\\\\\\\
\\\\\\\"OnClentLeave"\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
*/

#include "aps_include"
void main()
{
object oPC=GetExitingObject();

// Считываем имЯ игрока с его локальной строчки заданной при входе на сервер
string sName=SQLEncodeSpecialChars(GetLocalString(oPC,"Name"));

// Считываем логин игрока с его локальной строчки заданной при входе на сервер
string sLogin=SQLEncodeSpecialChars(GetLocalString(oPC,"Login"));
string sPC_DM = "PC"; if (GetIsDM(oPC)==TRUE)sPC_DM = "DM";////ДМ или Игрок
//
//Выполним запрос SQL - выбираем строчку где логин и чар-нейм = логин и ИМЯ персонажа ушедшего игрока
string sSelect = "SELECT * FROM `reg_data` WHERE login='"+sLogin+
"' AND name='" +sName+ "' AND pc_dm='"+sPC_DM+"'";

//Команда MySQL "Изменить "line_status" на "off", где логин и имЯ = логину и имени ушедшего игрока.
string sLine_Status = "UPDATE `reg_data` SET line_status = 'off' WHERE login='"+sLogin+
"' AND name='" +sName+ "' AND pc_dm='"+sPC_DM+"'";

SQLExecDirect(sSelect);
if (SQLFirstRow() == SQL_SUCCESS)
    {
    SendMessageToPC(oPC,"Статус изменен на [Off Line]");
    SQLExecDirect(sLine_Status);
    }
}



Сообщение отредактировал Twin - Jan 9 2005, 17:24
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Nov 29 2004, 10:11
Сообщение #42


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



продолжение

OnPlayerLevelUp

Neverwinter Script Source
/*
////////////////////////////////
//////Created By: Avaddon//////
//////Date: 28. 11. 2004//////
/////////////////////////////
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\MYSQL SERVER STATUS\\\\\\\
\\\\\\Put this script:\\\\\\\\\
\\\\\\\"OnPlayerLevelUp"\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
*/


#include "aps_include"
void main()
{
object oPC = GetPCLevellingUp();
string sAllLevels = IntToString(GetHitDice(oPC));
//Классы игрока///////////////////////////////////////////
int iNum;                                   //
for (iNum=0; iNum<4; iNum++)
{
string sClass;                                          //
int iClass = GetClassByPosition(iNum,oPC);              //
switch (iClass)                                         //
    {                                                   //
    case CLASS_TYPE_ARCANE_ARCHER:                      //
    sClass = "Тайный Стрелок";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_ASSASSIN:                           //
    sClass = "Убийца";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_BARBARIAN:                          //
    sClass = "Варвар";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_BARD:                               //
    sClass = "Бард";                                    //
    break;                                              //
                                                        //
    case CLASS_TYPE_BLACKGUARD:                         //
    sClass = "Страж Тьмы";                              //
    break;                                              //
                                                        //
    case CLASS_TYPE_CLERIC:                             //
    sClass = "Клирик";                                  //
    break;                                              //
                                                        //
    case CLASS_TYPE_DIVINECHAMPION:                     //
    sClass = "Чемпион Торма";                           //
    break;                                              //
                                                        //
    case CLASS_TYPE_DRAGONDISCIPLE:                     //
    sClass = "Ученик Дракона";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_DRUID:                              //
    sClass = "Друид";                                   //
    break;                                              //
                                                        //
    case CLASS_TYPE_DWARVENDEFENDER:                    //
    sClass = "Защитник Дворфов";                        //
    break;                                              //
                                                        //
    case CLASS_TYPE_FIGHTER:                            //
    sClass = "Воин";                                    //
    break;                                              //
                                                        //
    case CLASS_TYPE_HARPER:                             //
    sClass = "Разведчик Арфистов";                      //
    break;                                              //
                                                        //
    case CLASS_TYPE_INVALID:                            //
    sClass = " - ";                                     //
    break;                                              //
                                                        //
    case CLASS_TYPE_MONK:                               //
    sClass = "Монах";                                   //
    break;                                              //
                                                        //
    case CLASS_TYPE_PALADIN:                            //
    sClass = "Паладин";                                 //
    break;                                              //
                                                        //
    case CLASS_TYPE_PALEMASTER:                         //
    sClass = "Бледный Мастер";                          //
    break;                                              //
                                                        //
    case CLASS_TYPE_RANGER:                             //
    sClass = "Следопыт";                                //
    break;                                              //
                                                        //
    case CLASS_TYPE_ROGUE:                              //
    sClass = "Плут";                                    //
    break;                                              //
                                                        //
    case CLASS_TYPE_SHADOWDANCER:                       //
    sClass = "Танцор Тени";                             //
    break;                                              //
                                                        //
    case CLASS_TYPE_SHIFTER:                            //
    sClass = "Оборотень";                               //
    break;                                              //
                                                        //
    case CLASS_TYPE_SORCERER:                           //
    sClass = "Волшебник";                               //
    break;                                              //
                                                        //
    case CLASS_TYPE_WEAPON_MASTER:                      //
    sClass = "Мастер Оружий";                           //
    break;                                              //
                                                        //
    case CLASS_TYPE_WIZARD:                             //
    sClass = "Маг";                                     //
    break;                                              //
    }                                                   //
    SetLocalString(oPC,"Class"+IntToString(iNum),sClass);
    SetLocalString(oPC,"Level"+IntToString(iNum),IntToString(GetLevelByPosition(iNum,oPC)));//;
//////////////////////////////////////////////////////////
}
string sName=SQLEncodeSpecialChars(GetName(oPC));
string sLogin=SQLEncodeSpecialChars(GetPCPlayerName(oPC));
//Читаем уровни 1,2, и 3  класса
string sLevel1 = GetLocalString(oPC,"Level1");
string sLevel2 = GetLocalString(oPC,"Level2");
string sLevel3 = GetLocalString(oPC,"Level3");

//Читаем 1,2, и 3  класс
string sClass_1 = GetLocalString(oPC,"Class1")+" ("+sLevel1+")";
string sClass_2 = GetLocalString(oPC,"Class2")+" ("+sLevel2+")";
string sClass_3 = GetLocalString(oPC,"Class3")+" ("+sLevel3+")";

//Команда MySQL "Обновить уровни игрока"
string sLevel = "UPDATE `reg_data` SET levels = '"+sAllLevels+
"', class_1 = '"+sClass_1+
"', class_2 = '"+sClass_2+
"', class_3 = '"+sClass_3+
"' WHERE login = '"+sLogin+"' AND name = '"+sName+"'";

SQLExecDirect(sLevel);
}


PHP-скрипт by [MoF]Darth_Nick
Я его немного модифицировал под классы, а так же чтобы сервер говорил об отсутствии игроков на сервере

УДАЛЕНО. Айваном.

Сообщение отредактировал Aiwan - Jul 26 2005, 10:12
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Dec 4 2004, 23:45
Сообщение #43


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



В одном из моих постов, в Базе Скриптов я опубликовал скрипт на отдых в дикой местности.
Теперь, я бы хотел уделить внимаение отдыху в гостинице.
И так, что нам надо для того чтобы организовать отдых в гостиничной комнате?

1. Нам нужен этот хак (0.04 мб), который заменяет в тайлах простые кровати, на такие же по виду кровати, но на которые игрок может забраться.

2. Нам надо сделать гостиничную комнату. Тэг локации должен начинаться с "free". Например, free_inn_rooms.
Я делал одну локацию в которой много гостиничных комнат, никаким образом не соединенных между собой. В каждой комнате перед кроватью стоит ВэйПоинт с тэгом "BED" и на кровати стоит ВэйПоинт с тэгом "SLEEP".

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

На события модуля OnPlayerRest ставим нижеследующий скрипт.
Neverwinter Script Source
/*
////////////////////////////////
//////Created By: Avaddon//////
//////Date: 04. 12. 2004//////
/////////////////////////////
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\\INN ROOM FREE REST\\\\\\\
\\\\\\Put this script:\\\\\\\\\
\\\\\\\"OnPlayerRest"\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
*/

void main()
{
//Эффекты сна
effect eBlack = EffectVisualEffect(VFX_DUR_BLACKOUT);
effect eZzz =  EffectVisualEffect(VFX_IMP_SLEEP);
effect eSlow = EffectSlow();

object oPC = GetLastPCRested();

//Вейпоинт с тэгом "BED" должен находитсЯ перед кроватью на полу
object oBed = GetNearestObjectByTag("BED",oPC);

/*Вейпоинт с тегом "SLEEP" должен находитсЯ на самой кровати
(Я надеюсь вы скачали хак с фиксом кровати на nwvault.ign.com)*/

object oSleep = GetNearestObjectByTag("SLEEP",oPC);

//Берем предметы в слотах
object oArmor =GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);
object oRightHand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
object oLeftHand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
object oBoots = GetItemInSlot(INVENTORY_SLOT_BOOTS,oPC);
object oHelmet = GetItemInSlot(INVENTORY_SLOT_HEAD,oPC);
object oBelt = GetItemInSlot(INVENTORY_SLOT_BELT,oPC);
object oCloak = GetItemInSlot(INVENTORY_SLOT_CLOAK,oPC);
object oArms = GetItemInSlot(INVENTORY_SLOT_ARMS,oPC);

//В качестве тэгов предметов читаем переменные с игрока
string sFree = GetTag(GetArea(oPC));
string sArmor = GetLocalString(oPC,"armor");
string sRightHand = GetLocalString(oPC,"right");
string sLeftHand = GetLocalString(oPC,"left");
string sHelmet = GetLocalString(oPC,"helmet");
string sBoots = GetLocalString(oPC,"boots");
string sBelt = GetLocalString(oPC,"belt");
string sCloak = GetLocalString(oPC,"cloak");
string sArms = GetLocalString(oPC,"arms");

    /*Проверка арены в которой находитсЯ игрок решивший отдохнуть.
    Если тег арены начинаетсЯ с "free" (например "free_inn_rooms"),
    то наш скрипт начинает работу*/

    if(GetStringLeft(sFree,4)=="free")
    {
    //Если игрок еще не на кровати то...
        if(GetLocalInt(GetLastPCRested(),"on_bed")!=1)
        {
        //Записываем на игрока переменные с тегами одетых на него вещей
        SetLocalString(oPC,"armor",GetTag(oArmor));
        SetLocalString(oPC,"right",GetTag(oRightHand));
        SetLocalString(oPC,"left",GetTag(oLeftHand));
        SetLocalString(oPC,"helmet",GetTag(oHelmet));
        SetLocalString(oPC,"boots",GetTag(oBoots));
        SetLocalString(oPC,"belt",GetTag(oBelt));
        SetLocalString(oPC,"cloak",GetTag(oCloak));
        SetLocalString(oPC,"arms",GetTag(oArms));

        /*За 2 секунды он уже должен быть у кровати(расчитано на маленькую
        комнату с кроватью. Раздеваем игрока. Снимаем все кроме колец,
        боеприпасов, и амулета.*/

        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oArmor)));
        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oRightHand)));
        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oLeftHand)));
        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oHelmet)));
        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oBoots)));
        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oBelt)));
        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oCloak)));
        DelayCommand(2.0,AssignCommand(oPC,ActionUnequipItem(oArms)));

            //При событии отдых начат (в гостинице соответственно)...
            if (GetLastRestEventType()==REST_EVENTTYPE_REST_STARTED)
            {
            //ОтменЯем отдых и выполнЯем следущие действиЯ
            AssignCommand(oPC,ClearAllActions());

            //Подходим к кровати(как он подойдет - тут же разденетсЯ)
            AssignCommand(oPC,ActionMoveToObject(oBed));

            //Когда разденетсЯ - забираемсЯ на кровать
            DelayCommand(2.0,AssignCommand(oPC,ActionJumpToObject(oSleep)));

            //ВыставлЯем переменную "Игрок уже на кровати"
            DelayCommand(2.5,SetLocalInt(oPC,"on_bed",1));

            //Начинаем отдых
            DelayCommand(3.0,AssignCommand(oPC,ActionRest()));

            //Накладываем эффекты сна
            DelayCommand(3.5,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eZzz,oPC,10.0));
            DelayCommand(4.0,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eBlack,oPC,60.0));
            }//Заканчиваем условие "Если Отдых Начат"
        }//Заканчиваем условие "Если игрок не на кровати"
    }//Заканчиваем условие "Если тег арены начинаетсЯ с 'free' "
    else
    {
    /*Здесь - действие которое происходит если тег арены в которой игрок
    находитсЯ не начинаетсЯ с "free".
    Тут "AssignCommand(oPC,ClearAllActions()" - отменЯет отдых. Вы же,
    можете вставить любой другой скрипт, или команды длЯ другого типа отдыха,
    например на природе.*/

    AssignCommand(oPC,ClearAllActions());
    }

  //////////////////////////////////////////////////////////////////////
  /*Если Отдых Окончен или Прерван в арене с тегом начинающимсЯ с "free"
  и игрок находитсЯ на кровати.*/
/////////////////////////////////////

    if(GetStringLeft(sFree,4)=="free" && GetLocalInt(oPC,"on_bed")==1)
    {
        //Если Отдых Завершен
        if (GetLastRestEventType()==REST_EVENTTYPE_REST_FINISHED)
        {
        //Одеваем игрока обратно (теги предметов бывших на нем одетыми читаем из локалок игрока)
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sArmor), INVENTORY_SLOT_CHEST)));
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sRightHand), INVENTORY_SLOT_RIGHTHAND)));
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sLeftHand), INVENTORY_SLOT_LEFTHAND)));
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sBoots), INVENTORY_SLOT_BOOTS)));
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sHelmet), INVENTORY_SLOT_HEAD)));
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sBelt), INVENTORY_SLOT_BELT)));
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sCloak), INVENTORY_SLOT_CLOAK)));
        DelayCommand(2.0,AssignCommand(oPC, ActionEquipItem(GetItemPossessedBy(oPC,sArms), INVENTORY_SLOT_ARMS)));

        //Встаем с кровати
        AssignCommand(oPC,ActionJumpToObject(oBed));

        //Стираем с игрока все локалки предметов и того что он был на кровати.
        DeleteLocalInt(oPC,"on_bed");
        DeleteLocalString(oPC,"armor");
        DeleteLocalString(oPC,"right");
        DeleteLocalString(oPC,"left");
        DeleteLocalString(oPC,"helmet");
        DeleteLocalString(oPC,"boots");
        DeleteLocalString(oPC,"belt");
        DeleteLocalString(oPC,"cloak");
        DeleteLocalString(oPC,"arms");

        //Убираем эффекты сна
        RemoveEffect(oPC,eBlack);
        }//Заканчиваем условие "Если Отдых Завершен

        /*Если Отдых Прерван То одевать игрока не будем (он проснулсЯ с перепугу,
        или разбудили там.. Не дали спокойно собратьсЯ вобщем.*/

        if (GetLastRestEventType()==REST_EVENTTYPE_REST_CANCELLED)
        {
        //Встаем с кровати
        AssignCommand(oPC,ActionJumpToObject(oBed));

        //Стираем с игрока все локалки предметов и того что он был на кровати.
        DeleteLocalInt(oPC,"on_bed");
        DeleteLocalString(oPC,"armor");
        DeleteLocalString(oPC,"right");
        DeleteLocalString(oPC,"left");
        DeleteLocalString(oPC,"helmet");
        DeleteLocalString(oPC,"boots");
        DeleteLocalString(oPC,"belt");
        DeleteLocalString(oPC,"cloak");
        DeleteLocalString(oPC,"arms");

        /*Эффекты сна не снимаем
        И накладываем Blackout и эффект замедлениЯ,
        чтобы игрок 30 секунд приходилв себЯ.*/


        ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSlow,oPC,30.0);
        //Периодически игрок полусонный подхрапывает
        ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eZzz,oPC,10.0);
        DelayCommand(10.0,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eZzz,oPC,10.0));
        DelayCommand(20.0,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eZzz,oPC,10.0));
        }
    }
}


Сообщение отредактировал Twin - Jan 8 2005, 05:55
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Twin
сообщение Dec 7 2004, 11:38
Сообщение #44


Level 5
**

Класс: Некромант
Характер: Neutral Evil
Раса: Нежить
NWN: Скриптинг [PW]




Пара функций для сохранения и восстановления всех свойств предмета. Дают возможность конвертировать все перманентные (и только перманентные) свойства предмета в строку, которую можно сохранить куда хотите. И также восстановить все свойства (кроме On Monster Hit) из этой строки на предмет. Также сохраняются заряды палочек.
Не сохраняется:
Кастомный вид брони и оружия.
Additional Price отличная от ResRef'овской.
Свойство On Monster Hit (его можно ставить только на Creature Weapon) сохраняется нормально, но при восстановлении работает некорректно. Вернее два из подствойств (SubType) этого свойства не получается восстановить. Карочи, а оно вам ваще нужно? ;)
Количество использований свойства X uses/day. То есть при восстановлении данного свойства из строки возможно, что количество использований обновится как будто после отдыха - не проверял.
Наверняка что-то еще не сохраняется, но мне в голову ничего не приходит.
Neverwinter Script Source
/*
** Конвертациz свойств предмета в строку.
*/

string GetProperties(object oItem)
{
    string sProperties = IntToString(GetItemCharges(oItem));
    int nTemp;
    itemproperty ipTemp = GetFirstItemProperty(oItem);

    while (GetIsItemPropertyValid(ipTemp))
    {
        if (GetItemPropertyDurationType(ipTemp) == 2)
        {
            sProperties += "@"+
                IntToString(GetItemPropertyType(ipTemp)) +":";

            nTemp = GetItemPropertyParam1Value(ipTemp);
            if (nTemp == 255 || nTemp == -1)
                sProperties += "-1:";
            else
                sProperties += IntToString(nTemp - 1) +":";

            sProperties +=
                IntToString(GetItemPropertyCostTable(ipTemp)) +":";

            nTemp = GetItemPropertyCostTableValue(ipTemp);
            if (nTemp == -1)
                sProperties += "-1:";
            else
                sProperties += IntToString(nTemp - 1) +":";

            nTemp = GetItemPropertySubType(ipTemp);
            if (nTemp == -1) sProperties += "0";
            else            sProperties += IntToString(nTemp);
        }

        ipTemp = GetNextItemProperty(oItem);
    }

    return sProperties;
}

/*
** Установка свойств предмета из строки.
*/

void SetProperties(object oItem, string sProperties)
{
    //SendMessageToPC(GetFirstPC(), "SetProperties :: sProperties == "+ sProperties);

    itemproperty ipTemp = GetFirstItemProperty(oItem);
    while (GetIsItemPropertyValid(ipTemp))
    {
        RemoveItemProperty(oItem, ipTemp);
        ipTemp = GetNextItemProperty(oItem);
    }

    int i = 1;
    int pos, nCharges;
    string sTemp;

    nCharges = StringToInt(GetStringLeft(sProperties, FindSubString(sProperties, "@")));
    if (nCharges > 0)
        SetItemCharges(oItem, nCharges);

    while ((pos = FindSubString(sProperties, "@")) != -1)
    {
        sProperties = GetStringRight(sProperties, GetStringLength(sProperties) - pos - 1);

        pos = FindSubString(sProperties, "@");
        if (pos == -1)
            pos = GetStringLength(sProperties);

        sTemp = GetStringLeft(sProperties, pos);

        //SendMessageToPC(GetFirstPC(), "sTemp["+ IntToString(i) +"] == "+ sTemp);
        SetProperty(oItem, sTemp);

        i++;
    }
}

void SetProperty(object oItem, string sProperty)
{
    int pos = FindSubString(sProperty, ":");
    int nType = StringToInt(GetSubString(sProperty, 0, pos));

    sProperty = GetSubString(sProperty, pos + 1, GetStringLength(sProperty));
    pos = FindSubString(sProperty, ":");
    int nParam1Value = StringToInt(GetSubString(sProperty, 0, pos));
    nParam1Value++;

    sProperty = GetSubString(sProperty, pos + 1, GetStringLength(sProperty));
    pos = FindSubString(sProperty, ":");
    int nCostTable = StringToInt(GetSubString(sProperty, 0, pos));

    sProperty = GetSubString(sProperty, pos + 1, GetStringLength(sProperty));
    pos = FindSubString(sProperty, ":");
    int nCostTableValue = StringToInt(GetSubString(sProperty, 0, pos));
    nCostTableValue++;

    sProperty = GetSubString(sProperty, pos + 1, GetStringLength(sProperty));
    int nSubType = StringToInt(sProperty);

    itemproperty ipTemp;

    switch (nType)
    {
/*OK*/  case ITEM_PROPERTY_ABILITY_BONUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ABILITY_BONUS _OK_");
            ipTemp = ItemPropertyAbilityBonus(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_AC_BONUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_AC_BONUS _OK_");
            ipTemp = ItemPropertyACBonus(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_AC_BONUS_VS_ALIGNMENT_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_AC_BONUS_VS_ALIGNMENT_GROUP _OK_");
            ipTemp = ItemPropertyACBonusVsAlign(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_AC_BONUS_VS_DAMAGE_TYPE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_AC_BONUS_VS_DAMAGE_TYPE _OK_");
            ipTemp = ItemPropertyACBonusVsDmgType(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_AC_BONUS_VS_RACIAL_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_AC_BONUS_VS_RACIAL_GROUP _OK_");
            ipTemp = ItemPropertyACBonusVsRace(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_AC_BONUS_VS_SPECIFIC_ALIGNMENT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_AC_BONUS_VS_SPECIFIC_ALIGNMENT _OK_");
            ipTemp = ItemPropertyACBonusVsSAlign(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ARCANE_SPELL_FAILURE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ARCANE_SPELL_FAILURE _OK_");
            ipTemp = ItemPropertyArcaneSpellFailure(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ATTACK_BONUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ATTACK_BONUS _OK_");
            ipTemp = ItemPropertyAttackBonus(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ATTACK_BONUS_VS_ALIGNMENT_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ATTACK_BONUS_VS_ALIGNMENT_GROUP _OK_");
            ipTemp = ItemPropertyAttackBonusVsAlign(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ATTACK_BONUS_VS_RACIAL_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ATTACK_BONUS_VS_RACIAL_GROUP _OK_");
            ipTemp = ItemPropertyAttackBonusVsRace(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT _OK_");
            ipTemp = ItemPropertyAttackBonusVsSAlign(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_BASE_ITEM_WEIGHT_REDUCTION:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_BASE_ITEM_WEIGHT_REDUCTION _OK_");
            ipTemp = ItemPropertyWeightReduction(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_BONUS_FEAT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_BONUS_FEAT _OK_");
            ipTemp = ItemPropertyBonusFeat(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N _OK_");
            ipTemp = ItemPropertyBonusLevelSpell(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_CAST_SPELL:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_CAST_SPELL _OK_");
            ipTemp = ItemPropertyCastSpell(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DAMAGE_BONUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DAMAGE_BONUS _OK_");
            ipTemp = ItemPropertyDamageBonus(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP _OK_");
            ipTemp = ItemPropertyDamageBonusVsAlign(nSubType, nParam1Value, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP _OK_");
            ipTemp = ItemPropertyDamageBonusVsRace(nSubType, nParam1Value, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT _OK_");
            ipTemp = ItemPropertyDamageBonusVsSAlign(nSubType, nParam1Value, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DAMAGE_REDUCTION:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DAMAGE_REDUCTION _OK_");
            ipTemp = ItemPropertyDamageReduction(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DAMAGE_RESISTANCE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DAMAGE_RESISTANCE _OK_");
            ipTemp = ItemPropertyDamageResistance(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DAMAGE_VULNERABILITY:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DAMAGE_VULNERABILITY _OK_");
            ipTemp = ItemPropertyDamageVulnerability(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DARKVISION:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DARKVISION _OK_");
            ipTemp = ItemPropertyDarkvision();
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_ABILITY_SCORE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_ABILITY_SCORE _OK_");
            ipTemp = ItemPropertyDecreaseAbility(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_AC:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_AC _OK_");
            ipTemp = ItemPropertyDecreaseAC(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER _OK_");
            ipTemp = ItemPropertyAttackPenalty(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_DAMAGE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_DAMAGE _OK_");
            ipTemp = ItemPropertyDamagePenalty(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_ENHANCEMENT_MODIFIER:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_ENHANCEMENT_MODIFIER _OK_");
            ipTemp = ItemPropertyEnhancementPenalty(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_SAVING_THROWS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_SAVING_THROWS _OK_");
            ipTemp = ItemPropertyReducedSavingThrowVsX(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_SAVING_THROWS_SPECIFIC:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_SAVING_THROWS_SPECIFIC _OK_");
            ipTemp = ItemPropertyReducedSavingThrow(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_DECREASED_SKILL_MODIFIER:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_DECREASED_SKILL_MODIFIER _OK_");
            ipTemp = ItemPropertyDecreaseSkill(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ENHANCED_CONTAINER_REDUCED_WEIGHT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ENHANCED_CONTAINER_REDUCED_WEIGHT _OK_");
            ipTemp = ItemPropertyContainerReducedWeight(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ENHANCEMENT_BONUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ENHANCEMENT_BONUS _OK_");
            ipTemp = ItemPropertyEnhancementBonus(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP _OK_");
            ipTemp = ItemPropertyEnhancementBonusVsAlign(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_RACIAL_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_RACIAL_GROUP _OK_");
            ipTemp = ItemPropertyEnhancementBonusVsRace(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT ?_OK_");
            ipTemp = ItemPropertyEnhancementBonusVsSAlign(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_EXTRA_MELEE_DAMAGE_TYPE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_EXTRA_MELEE_DAMAGE_TYPE _OK_");
            ipTemp = ItemPropertyExtraMeleeDamageType(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_EXTRA_RANGED_DAMAGE_TYPE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_EXTRA_RANGED_DAMAGE_TYPE _OK_");
            ipTemp = ItemPropertyExtraRangeDamageType(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_FREEDOM_OF_MOVEMENT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_FREEDOM_OF_MOVEMENT _OK_");
            ipTemp = ItemPropertyFreeAction();
            break;
/*OK*/  case ITEM_PROPERTY_HASTE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_HASTE _OK_");
            ipTemp = ItemPropertyHaste();
            break;
/*OK*/  case ITEM_PROPERTY_HEALERS_KIT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_HEALERS_KIT _OK_");
            ipTemp = ItemPropertyHealersKit(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_HOLY_AVENGER:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_HOLY_AVENGER _OK_");
            ipTemp = ItemPropertyHolyAvenger();
            break;
/*OK*/  case ITEM_PROPERTY_IMMUNITY_DAMAGE_TYPE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_IMMUNITY_DAMAGE_TYPE _OK_");
            ipTemp = ItemPropertyDamageImmunity(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS _OK_");
            ipTemp = ItemPropertyImmunityMisc(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_IMMUNITY_SPECIFIC_SPELL:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_IMMUNITY_SPECIFIC_SPELL _OK_");
            ipTemp = ItemPropertySpellImmunitySpecific(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_IMMUNITY_SPELL_SCHOOL:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_IMMUNITY_SPELL_SCHOOL _OK_");
            ipTemp = ItemPropertySpellImmunitySchool(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_IMMUNITY_SPELLS_BY_LEVEL:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_IMMUNITY_SPELLS_BY_LEVEL _OK_");
            ipTemp = ItemPropertyImmunityToSpellLevel(nCostTableValue+1);
            break;
/*OK*/  case ITEM_PROPERTY_IMPROVED_EVASION:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_IMPROVED_EVASION _OK_");
            ipTemp = ItemPropertyImprovedEvasion();
            break;
/*OK*/  case ITEM_PROPERTY_KEEN:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_KEEN _OK_");
            ipTemp = ItemPropertyKeen();
            break;
/*OK*/  case ITEM_PROPERTY_LIGHT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_LIGHT _OK_");
            ipTemp = ItemPropertyLight(nCostTableValue, nParam1Value);
            break;
/*OK*/  case ITEM_PROPERTY_MASSIVE_CRITICALS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_MASSIVE_CRITICALS _OK_");
            ipTemp = ItemPropertyMassiveCritical(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_MIGHTY:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_MIGHTY _OK_");
            ipTemp = ItemPropertyMaxRangeStrengthMod(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_MIND_BLANK:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_MIND_BLANK");
            break;
/*OK*/  case ITEM_PROPERTY_MONSTER_DAMAGE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_MONSTER_DAMAGE ?OK?");
            ipTemp = ItemPropertyMonsterDamage(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_NO_DAMAGE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_NO_DAMAGE _OK_");
            ipTemp = ItemPropertyNoDamage();
            break;
/*OK*/  case ITEM_PROPERTY_ON_HIT_PROPERTIES:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ON_HIT_PROPERTIES _OK_");
            ipTemp = ItemPropertyOnHitProps(nSubType, nCostTableValue, nParam1Value);
            break;
/*FAIL*/case ITEM_PROPERTY_ON_MONSTER_HIT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ON_MONSTER_HIT _PARTIAL_ "+ IntToString(nSubType) +"!"+ IntToString(nParam1Value));
            ipTemp = ItemPropertyOnMonsterHitProperties(nSubType, nParam1Value);
            break;
/*OK*/  case ITEM_PROPERTY_ONHITCASTSPELL:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_ONHITCASTSPELL _OK_");
            ipTemp = ItemPropertyOnHitCastSpell(nSubType, nCostTableValue+1);
            break;
/*OK*/  case ITEM_PROPERTY_POISON:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_POISON");
            break;
/*OK*/  case ITEM_PROPERTY_REGENERATION:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_REGENERATION _OK_");
            ipTemp = ItemPropertyRegeneration(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_REGENERATION_VAMPIRIC:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_REGENERATION_VAMPIRIC _OK_");
            ipTemp = ItemPropertyVampiricRegeneration(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_SAVING_THROW_BONUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_SAVING_THROW_BONUS _OK_");
            ipTemp = ItemPropertyBonusSavingThrowVsX(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC _OK_");
            ipTemp = ItemPropertyBonusSavingThrow(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_SKILL_BONUS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_SKILL_BONUS _OK_");
            ipTemp = ItemPropertySkillBonus(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_SPECIAL_WALK:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_SPECIAL_WALK ?OK?");
            ipTemp = ItemPropertySpecialWalk(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_SPELL_RESISTANCE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_SPELL_RESISTANCE _OK_");
            ipTemp = ItemPropertyBonusSpellResistance(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_THIEVES_TOOLS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_THIEVES_TOOLS _OK_");
            ipTemp = ItemPropertyThievesTools(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_TRAP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_TRAP _OK_");
            ipTemp = ItemPropertyTrap(nSubType, nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_TRUE_SEEING:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_TRUE_SEEING _OK_");
            ipTemp = ItemPropertyTrueSeeing();
            break;
/*OK*/  case ITEM_PROPERTY_TURN_RESISTANCE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_TURN_RESISTANCE _OK_");
            ipTemp = ItemPropertyTurnResistance(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_UNLIMITED_AMMUNITION:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_UNLIMITED_AMMUNITION _OK_");
            ipTemp = ItemPropertyUnlimitedAmmo(nCostTableValue);
            break;
/*OK*/  case ITEM_PROPERTY_USE_LIMITATION_ALIGNMENT_GROUP:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_USE_LIMITATION_ALIGNMENT_GROUP _OK_");
            ipTemp = ItemPropertyLimitUseByAlign(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_USE_LIMITATION_CLASS:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_USE_LIMITATION_CLASS _OK_");
            ipTemp = ItemPropertyLimitUseByClass(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_USE_LIMITATION_RACIAL_TYPE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_USE_LIMITATION_RACIAL_TYPE _OK_");
            ipTemp = ItemPropertyLimitUseByRace(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_USE_LIMITATION_SPECIFIC_ALIGNMENT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_USE_LIMITATION_SPECIFIC_ALIGNMENT _OK_");
            ipTemp = ItemPropertyLimitUseBySAlign(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_USE_LIMITATION_TILESET:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_USE_LIMITATION_TILESET");
            break;
/*OK*/  case ITEM_PROPERTY_VISUALEFFECT:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_VISUALEFFECT _OK_");
            ipTemp = ItemPropertyVisualEffect(nSubType);
            break;
/*OK*/  case ITEM_PROPERTY_WEIGHT_INCREASE:
            //SendMessageToPC(GetFirstPC(), "const ITEM_PROPERTY_WEIGHT_INCREASE _OK_");
            ipTemp = ItemPropertyWeightIncrease(nParam1Value);
            break;
        default:
            //SendMessageToPC(GetFirstPC(), "const default");
            break;
    }

    if (GetIsItemPropertyValid(ipTemp)) {
        AddItemProperty(DURATION_TYPE_PERMANENT, ipTemp, oItem);
    }
}

Данный скрипт можно исползовать для создания банка вещей. Так как проблема сохранения вещей с динамическими теперь отпадает.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Tarre Talliorne
сообщение Jan 5 2005, 13:19
Сообщение #45


Level 8
***

Класс: Псионик
Характер: Chaotic Good
Раса: Человек
NWN: Скриптинг [Sn]



http://rage-t.boom.ru/creative.html
На эой страничке нашего сайта висят пару библиотек. ИМХО довольно полезных.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Лито
сообщение Jan 27 2005, 21:00
Сообщение #46


Level 9
***

Класс: Страж Тьмы
Характер: Chaotic Evil
Раса: Нежить



Многие начинающие не могут нормально соединить несколько отдельных скриптов в один целый, например часто надо вписывать в скрипт OnClientEnter дополнительные...хм...вещи. Специально для них я сделал систему захода игрока на сервер. она соединяет два скрипта _kaa_ и baal в одно целое, кроме того в системе реализованна выдача начального пакета по класу. Все что надо изменить это вбить РесРефы вещей которые вы хотите дать игроку.
Проверка на первый заход производится с помощью проверки на наличие определенного предмета в инвенторе, то есть если этот предмет есть то скрипт останавливается на точке выдачи стартового пакета, если же этого предмета нет, то скрипт выдает игроку этот предмет:) и стартовый пакет. В моем случае этот предмет oBook, создаете предмет, копируете его ресреф и заменяете
object oBook=GetItemPossessedBy(oPC, "item004"); на свой

Вот сама система:
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: module_enter
//:://////////////////////////////////////////////
/*   system OnClientEnter
*/

//:://////////////////////////////////////////////
//:: Created By: _kaa_ , Baal , Ëèòî
//:: Created On: Jan 27, 2005
//:://////////////////////////////////////////////
#include "nw_o0_itemmaker"
void main()
{
object oPC = GetEnteringObject();
object oStore = GetModule();
string sStoreName = GetName(oPC)+GetPCPlayerName(oPC); // =[PC name] + [login name]
SetLocalString(oPC,"HP_MyIdString",sStoreName); // Çàãðóçêà õèò ïîèíòîâ è ñïåëëîâ
int iSavedHP = GetLocalInt(oStore,sStoreName);
if (iSavedHP != 0)
{
effect efDamage = EffectDamage(GetMaxHitPoints(oPC)-iSavedHP,DAMAGE_TYPE_MAGICAL,DAMAGE_POWER_ENERGY);
ApplyEffectToObject(DURATION_TYPE_INSTANT,efDamage,oPC);
}

int k,j,nSpells;
for (k=1; k < 510; k++)
{
nSpells = GetLocalArrayInt(oStore,sStoreName+"_spells",k);
if (nSpells)
  for (j=0; j <= GetHasSpell(k,oPC)-nSpells; j++) DecrementRemainingSpellUses(oPC, k);
if(GetIsDM(oPC)) //Åñëè DM, òî íå âûäàâàòü ñòàðòîâûé ïàêåò
        return;
object oBook=GetItemPossessedBy(oPC, "item004");
if(!GetIsObjectValid(oBook))  //Åñëè äîñòóïåí ïðåäìåò ñ ResRef*îì "item004",
                              //íå âûäàâàòü ñòàðòîâûé ïàêåò, åñëè íå äîñòóïåí, òî óíè÷òîæèòü âñå âåùè â èíâåíòàðå
{
  object oItem = GetFirstItemInInventory (oPC);
  while(GetIsObjectValid(oItem))
    {
    DestroyObject(oItem);
    oItem = GetNextItemInInventory (oPC);
    }
  int i=0;
  while(i<14)
    {
    DestroyObject(GetItemInSlot(i, oPC));
    i++;
    }
if(GetLevelByClass(CLASS_TYPE_FIGHTER, oPC)) //Âûäà÷à íà÷àëüíîãî ïàêåòà ïî êëàññó
    {
  GiveGoldToCreature(oPC, 500);
  CreateItemOnObject("item004", oPC); //Âûäà÷à âåùåé ïî ResRef*àì
  CreateItemOnObject("Item", oPC);
   CreateItemOnObject("Item", oPC);
    CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_BARBARIAN, oPC))
  {
    GiveGoldToCreature(oPC, 500);
  CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
   CreateItemOnObject("Item", oPC);
    CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_MONK, oPC))
  {
      GiveGoldToCreature(oPC, 500);
  CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
   CreateItemOnObject("Item", oPC);
    CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_RANGER, oPC))
  {
    CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
   CreateItemOnObject("Item", oPC);
    CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_WIZARD, oPC))
  {
      CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
   CreateItemOnObject("Item", oPC);
    CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_SORCERER, oPC))
  {
  CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_BARD, oPC))
  {
    CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_DRUID, oPC))
  {
      CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_BARD, oPC))
  {
  CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_CLERIC, oPC))
  {
  CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_PALADIN, oPC))
  {
  CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  else if(GetLevelByClass(CLASS_TYPE_ROGUE, oPC))
  {
  CreateItemOnObject("item004", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("Item", oPC);
  CreateItemOnObject("item001", oPC);
  CreateItemOnObject("item003", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  CreateItemOnObject("it_mpotion004", oPC);
  }
  }
  }
}


Кроме того чтобы скрипт нормально работал надо поставить еще один(_kaa_) на OnClientLeave
Вот и он
Neverwinter Script Source
#include "nw_o0_itemmaker"
void main()
{
object oPC = GetExitingObject();
object oStore = GetModule();
string sStoreName = GetLocalString(oPC,"HP_MyIdString");
SetLocalInt(oStore, sStoreName, GetCurrentHitPoints(oPC));
int k,nSpells;
for (k=1;k<510;k++)
{
nSpells = GetHasSpell(k,oPC);
if (nSpells)
  SetLocalArrayInt(oStore,sStoreName+"_spells",k,nSpells);
}
}


Сообщение отредактировал Lex - Mar 18 2005, 23:36
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Jan 27 2005, 22:14
Сообщение #47


Level 5
Иконки Групп

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



Скрипт на смерть НПС. НПС исчезает, а на его месте появляется труп на который переносятся все вещи покойного. Сам труп исчезает через 250 секунд.

"low_plc_loot" - резреф трупа в палитре.
Neverwinter Script Source
//::Created by      Лито
//::Modificated by  Lex
void Clear(object oBag = OBJECT_SELF)
{
object oItem = GetFirstItemInInventory(oBag);
while (GetIsObjectValid(oItem))
  {
  DestroyObject(oItem);
  oItem = GetNextItemInInventory(oBag);
  }
DestroyObject(oBag,1.0);
}
void main()
{
string sTemplate = "low_plc_loot";
string sTag = GetTag(OBJECT_SELF);
location lLoc = GetLocation(OBJECT_SELF);
object oloot = CreateObject(OBJECT_TYPE_PLACEABLE, sTemplate, lLoc, TRUE, sTag);
int i = 0;
object oItem = GetFirstItemInInventory(OBJECT_SELF);
while (GetIsObjectValid(oItem))
    {
    if (GetDroppableFlag(oItem))
       CopyObject(oItem,lLoc,oloot);
    DestoyObject(oItem);
    oItem = GetNextItemInInventory(OBJECT_SELF);
    }
oItem = GetItemInSlot(i,OBJECT_SELF);
while (i<14)
    {
    if (GetDroppableFlag(oItem))
       CopyObject(oItem,lLoc,oloot);
    DestoyObject(oItem);
    i++;
    oItem = GetItemInSlot(i,OBJECT_SELF);
    }
AssignCommand(oloot,DelayCommand(250.0,Clear(oloot)));
}


Сообщение отредактировал DBColl - Mar 12 2005, 12:09
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Mar 13 2005, 20:25
Сообщение #48


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



СКРИПТ ВЕДУЩИЙ ИГРОКА ЗА НПС ПО ТОЧКАМ.
Вейпов должно быть столько сколько я нарисовал, но либо меньше 10 ли бо больше чем у меня. Почему? Не знаю, неделю гонял Стинки по вейпам и он гад прыгал на некоторые из них при количестве 10, а так нет. Идет как миленький.
и расчитай скорость так, что бы НПС НЕ ЗАСТРЯЛ и не опаздал на 15 сек до точки. Иначе вы просто прыгнете на следующий вейп и диалог прервется. А так он остановится и продолжите диалог.

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!  www.wrg.ru
//:: am_pc_stinki_go2
//:://////////////////////////////////////////////
/*
  ПЕРЕДВИЖЕНИЕ оРС ЗА НПС, СКРИПТ СТАВИТСЯ
    НА СТРОКУ В ДИАЛОГЕ oPC (!)

*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan    Aiwan@e-mail.ru
//:: Created On: 20.03.2004
//:://////////////////////////////////////////////
void main()
{
    object oPC = GetPCSpeaker();
    object oStinki = GetObjectByTag("MM_STINKI");
    object oWp01 = GetObjectByTag("WP_STINKI_01");
    object oWp02 = GetObjectByTag("WP_STINKI_02");
    object oWp03 = GetObjectByTag("WP_STINKI_03");
    object oWp04 = GetObjectByTag("WP_STINKI_04");
    object oWp05 = GetObjectByTag("WP_STINKI_05");
    object oWp06 = GetObjectByTag("WP_STINKI_06");
    object oWp07 = GetObjectByTag("WP_STINKI_07");
    object oWp08 = GetObjectByTag("WP_STINKI_08");
    object oWp09 = GetObjectByTag("WP_STINKI_09");
    object oWp10 = GetObjectByTag("WP_STINKI_10");
    object oWp11 = GetObjectByTag("WP_STINKI_11");
    object oDoor = GetObjectByTag("AM_DOOR_FLEG_NO");
    effect eHaste = EffectHaste(); // ЧТО БЫ ИГРОК НЕ ОТСТАВАЛ!

    SetLocalInt(oPC, "STINKI", 3);
    AssignCommand(oStinki, ActionPauseConversation());
    AssignCommand(oPC, ActionForceFollowObject(oStinki, 4.0f));
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHaste, oPC, 9999.0);
    AssignCommand(oStinki, ActionDoCommand(SetCommandable(FALSE, oPC)));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp02, TRUE, 4.0));
    AssignCommand(oStinki, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
    AssignCommand(oStinki, ActionDoCommand(SpeakString("Не отставай!")));
    AssignCommand(oStinki, ActionWait(1.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp03, TRUE, 4.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp04, TRUE, 4.0));
    AssignCommand(oStinki, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
    AssignCommand(oStinki, ActionDoCommand(SpeakString("Не сильно быстро?")));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp05, TRUE, 4.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oDoor, TRUE, 4.0));
    AssignCommand(oStinki, ActionDoCommand(SpeakString("Не обращай внимание, нас никто не тронет.")));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp06, TRUE, 4.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp07, TRUE, 4.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp08, TRUE, 1.0));
    AssignCommand(oStinki, ActionDoCommand(SpeakString("Мы почти пришли!")));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp09, TRUE, 1.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp10, TRUE, 1.0));
    AssignCommand(oStinki, ActionWait(2.0));
    AssignCommand(oStinki, ActionForceMoveToObject(oWp11, TRUE, 1.0));
    AssignCommand(oStinki, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
    AssignCommand(oStinki, ActionDoCommand(RemoveEffect(oPC, eHaste)));
    AssignCommand(oStinki, ActionDoCommand(SetCommandable(TRUE, oPC)));
    AssignCommand(oStinki, ActionResumeConversation());
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 17 2005, 11:51
Сообщение #49


Level 5
Иконки Групп

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



СЕРИЯ "СКРИПТЫ ПРОКЛЯТИЯ ЛЕВОРА"
ЦИКЛ "СКРИПТЫ ДЯДЮШКИ LEX'А"


Цель:
сделать 2 (можно и более) НПС которые как будто между собой разговаривают.
(те, кто играл ПЛ в Тсурлаголе видели такие примеры. Особенно в тавернах.)
Реализация:
ставим 2х НПС, даем соотв. тэги и ставим между ними нивидимый объект, в ХБ которого вносим этот скрипт.

"+" - эффект диалога. Так как фразы стыкуются (вы сами их пишите так, что на вопрос дается ответ и прочее.) так как они все парные.
"-" - на каждую уникальную группу свой скрипт. Текст разговора пишется в скрипте.

Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Name lm_2speakers
//:: Copyright © 2004 -=WRG!=-
//:://////////////////////////////////////////////
/*
скрипт разговора 2-х НПС. Шаблон.
*/

//:://////////////////////////////////////////////
//:: Created By: Lex
//:: Created On: Agust 2004
//:://////////////////////////////////////////////

void ANIMATION(object oD)
/// Рандомная анимация во время разговора. настраивайте сами.
    {
    int A=0;
    float T,S;
    switch (Random(8)+1)
       {
       case 2: A=ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD;T=3.0;S=1.0;break;
       case 3: A=ANIMATION_FIREFORGET_TAUNT;T=3.0;S=1.0;break;
       case 4: A=ANIMATION_FIREFORGET_PAUSE_BORED;S=1.0;break;
       case 5: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break;
       case 6: A=ANIMATION_LOOPING_LISTEN;T=5.0;S=1.0;break;
       }
    if (A==0) return;
    AssignCommand(oD,PlayAnimation(A,S,T));
    }

void DIALOG(object oD1,object oD2)
    {
    string s1="",s2="";
    string ya = GetName(GetObjectByTag("ya")); // "+ya+"
    switch (Random(30))
         {
         case 0: s1="Как дела, друг?";s2="Да идут по маленьку..";break;
         case 1: s1="И как она? Симпатична"+ya+"?";s2="А как же! Ты мен"+ya+" обижаешь!";break;
         /// и так далее 20 фраз типа вопрос-выссказывание и ответ на это дело
         }
    AssignCommand(oD1,SpeakString(s1)); /// первый НПС говорит фразу
    AssignCommand(oD2,DelayCommand(5.0,SpeakString(s2))); /// второй отвечает
    }

void main()
{
object oPC = GetFirstPC();
if (GetArea(oPC)!=GetArea(OBJECT_SELF)) return; // если нет игрока, то молчим
object oD1 = GetNearestObjectByTag("SPEAKING_NPC_1"); // первый НПС
object oD2 = GetNearestObjectByTag("SPEAKING_NPC_1"); // второй НПС
if (GetIsInCombat(oD1)) return; // если первый НПС дерется то молчим
if (GetIsInCombat(oD2)) return; // если второй НПС дерется то молчим
if ( (IsInConversation(oD1)) || (IsInConversation(oD2)) ) return; /// если один из НПС разговаривает с игроком
if (GetDistanceToObject(oPC)>10.0) return; // если игрок далеко (больше 10 футов) то он как будто ничего не слышит.
AssignCommand(oD1,SetFacingPoint(GetPosition(oD2))); // повернуться навтречу друг другу
AssignCommand(oD2,SetFacingPoint(GetPosition(oD1)));
DIALOG(oD1,oD2);
ANIMATION(oD1);
ANIMATION(oD2);
}



================================================================================

Небольшой простенький скрипт на слот onDamage плэйсебла. (ТЭГ плэйса "DANGER")

Плэйс взрывается, если его повредить. Если у вас есть Проклятие Левора, то в пещере почти все бочки это объекты с таким скриптом. Сила взрыва растет, если рядом есть такие же объекты.
ВНИМАНИЕ: больше таких 5 рядом не ставить. Тормозит....скрипт не оптимален.
Делалася под СоУ, поэтому использованны не локалки, а поле
KeyTag. Скрипт старый и давно мной не улучшавшийся. Это вам просто для работы.
(как юзать в таком варианте KeyTaG:
ставим флаг Закрыто и Требуется ключ. Поле открывается. Теперь пишем туда что надо и снимаем флаг Закрыто.
ограничение: скрипт лучше не ставить на закрытые объекты, так как поле KeyTaG нужно для работы.)
в поле KeyTag радиус и сила взрыва: X_Y
X - сила по нижепреведенной шкале. По умолчанию 2
1 - слабый
2 - средний
3 - сильный
Y - радиус в футах. (не более 9). По умолчанию 5 футов.
подрыв объекта происходит при повреждении более чем на 30%.
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Name ******
//:: FileName lm_damage_danger
//:: Copyright © 2003 -=WRG!=-.
//:://////////////////////////////////////////////
/*
THIS SCRIPT CHECKS IF ANYBODY DAMAGED DANGER OBJECT MORE THEN 30%
THEN THE OBJECT EXPLOSE
EXPLOSION DEPENDS ON STRONG EXPLOSION RADIUS.
EXPLOSION RADIUS & STRONG ARE IN TrapKeyTag of object
*/

//:://////////////////////////////////////////////
//:: Created By: Lex
//:: Created On: October 2003
//:: Special thanks to:
//::    Baal (WRG) for advice about calculation power
//:://////////////////////////////////////////////

void DamageObject(float ExplosionRadius, int Strong, object oDamager, location lCenter)
   {
   float modifier=1.0;
   effect eAddition;
   int DamagePower=DAMAGE_POWER_PLUS_ONE;
   float fDistance = GetDistanceBetweenLocations(GetLocation(oDamager),lCenter);
   switch(Strong)
      {
      case 1: modifier=0.5;
              DamagePower=DAMAGE_POWER_NORMAL;
              eAddition = EffectFrightened();
              break;
      case 2: modifier=1.0;
              DamagePower=DAMAGE_POWER_PLUS_ONE;
              eAddition = EffectFrightened();
              break;
      case 3: modifier=1.5;
              DamagePower=DAMAGE_POWER_PLUS_TWO;
              eAddition = EffectParalyze();
              break;
      default:modifier=2.0;
              DamagePower=DAMAGE_POWER_PLUS_THREE;
              eAddition = EffectParalyze();
              break;
      }
   int iDamage = FloatToInt((ExplosionRadius*ExplosionRadius/2 - fDistance*fDistance/2)*modifier+modifier*5);
   effect eDamage = EffectDamage(iDamage,DAMAGE_TYPE_FIRE,DamagePower);
   AssignCommand(oDamager,ClearAllActions());
   AssignCommand(oDamager,DelayCommand(0.2,SetCommandable(FALSE,oDamager)));
   if (GetObjectType(oDamager)==OBJECT_TYPE_CREATURE)
       if (Random(2)==1)
           AssignCommand(oDamager,PlayAnimation(ANIMATION_LOOPING_DEAD_FRONT,0.6,2.0));
       else AssignCommand(oDamager,PlayAnimation(ANIMATION_LOOPING_DEAD_BACK,0.6,2.0));
   AssignCommand(oDamager,DelayCommand(0.8,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectVisualEffect(VFX_COM_HIT_FIRE),oDamager,1.0)));
   if (fDistance<=ExplosionRadius/3)
     {
     float time = modifier*ExplosionRadius/fDistance;
     AssignCommand(oDamager,DelayCommand(0.8,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eAddition,oDamager,time)));
     }
   AssignCommand(oDamager,DelayCommand(0.3,ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,oDamager)));
   AssignCommand(oDamager,DelayCommand(2.5,SetCommandable(TRUE,oDamager)));
   }
void main()
{
//========================================================
int iDamage;
float ExplosionRadius;
int Strong;
location lCenter;
int Next=TRUE;
int Filter;
int Explosion;
object oDamager;
string STR;
int Critical=0;
Filter = OBJECT_TYPE_CREATURE | OBJECT_TYPE_PLACEABLE;
lCenter = GetLocation(OBJECT_SELF);
if (GetTrapKeyTag(OBJECT_SELF)!="**")
   {
   ExplosionRadius=5.0;
   Strong=2;
   }
else if (GetTag(OBJECT_SELF)!="ITM_FIREMINE")
   {
    iDamage = GetMaxHitPoints()-GetCurrentHitPoints();
    STR = GetStringRight(GetTrapKeyTag(OBJECT_SELF),1);
    if (STR!="") ExplosionRadius = StringToFloat(STR);
    STR = GetStringLeft(GetTrapKeyTag(OBJECT_SELF),1);
    if (STR!="") Strong = StringToInt(STR);
    if ((Strong>3)||(Strong==0)) Strong=2;
    if ((ExplosionRadius>10.0)||(ExplosionRadius==0.0)) ExplosionRadius=5.0;
    if (iDamage*10 < GetMaxHitPoints()*3) return;
   }
else
   {
   ExplosionRadius = 6.5;
   Strong = 2;
   SendMessageToPC(GetFirstPC(),"MINE");
   }
Strong = GetLocalInt(OBJECT_SELF,"ADD_STRONG")+Strong;
if (Strong<3) Explosion = VFX_FNF_GAS_EXPLOSION_FIRE;
else Explosion = VFX_FNF_FIREBALL;
if ((iDamage<GetMaxHitPoints()/3)&&(GetDamageDealtByType(DAMAGE_TYPE_FIRE)==0)) return;
if (GetLocalInt(OBJECT_SELF,"ALREADY")) return;
SetLocalInt(OBJECT_SELF,"ALREADY",TRUE);
oDamager = GetFirstObjectInShape(SHAPE_SPHERE,ExplosionRadius,lCenter,TRUE,Filter);
object oPC = GetFirstPC();
DestroyObject(OBJECT_SELF);
if ((GetLocalInt(GetObjectByTag("TS_LOCALS"),"FIRECAMP_DESTROED"))&&(GetTag(GetArea(OBJECT_SELF))=="TSUR_SUB_EASTFOREST_BOMBCAVE"))
     return;
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY,EffectVisualEffect(VFX_IMP_PULSE_FIRE),lCenter,1.5);
ApplyEffectAtLocation(DURATION_TYPE_PERMANENT,EffectVisualEffect(Explosion),lCenter);
   while (GetIsObjectValid(oDamager))
     {
     if ((GetTag(oDamager)=="DANGER")&&(!GetLocalInt(oDamager,"ALREADY"))&&(GetDistanceToObject(oDamager)<=ExplosionRadius/2))
        {
        if (Next) SetLocalInt(oDamager,"ADD_STRONG",1);
        ExplosionRadius = ExplosionRadius + 2.0;
        Critical++;
        }
     if (Critical==3)
         {
         Next=TRUE;
         }
     if (Critical==5)
         {
         Strong++;
         Critical=0;
         }
     AssignCommand(oDamager,DamageObject(ExplosionRadius,Strong,oDamager,lCenter));
     oDamager = GetNextObjectInShape(SHAPE_SPHERE,ExplosionRadius,lCenter,TRUE,Filter);
     }
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Mar 17 2005, 16:18
Сообщение #50


Миловидный Бегрюссунг
Иконки Групп

Класс: Воин
Характер: Chaotic Good
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



СЕРИЯ "СКРИПТЫ ПРОКЛЯТИЯ ЛЕВОРА"
ЦИКЛ "СКРИПТЫ ДЯДЮШКИ AIWAN'А"


Скрипт который позволяет при наличии надетой брони с определенным ТЕГом ходить во вражественном лагере :) Ну или где там вам надо...
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Created By: WRG! Aiwan aiwan@e-mail.ru
//:: Created On: 14.01.2004
//:://////////////////////////////////////////////
//:: Скрипт проверки брони "Железного Трона"
//::  у РС на фрегате "Отшельник"
//:://////////////////////////////////////////////
#include "NW_I0_GENERIC"

void main()
{
if (GetArea(OBJECT_SELF) != GetArea(GetFirstPC()))
       return; // Если РС нет в локации то возврат
   int nEvent = GetUserDefinedEventNumber();
   if (nEvent == 1002) // Стандартный эвент на юзердеф
   {
    object oPC = GetLastPerceived();
    object oNPC = OBJECT_SELF;
    object oArm = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC); // Предмет в слоте РС "броня"
      if (GetLastPerceptionSeen() && GetIsPC(oPC))
         {
          if (GetTag(oArm) != "AM_ITM_IRONTRON" && GetLocalInt(oPC,"TRONE_ALARM") != 1)
          // Если Таг надетой брони не равен AM_ITM_IRONTRON и нет локалки тревоги
            {
             SetLocalInt(oPC, "TRONE_ALARM", 1); // Вы обнаружены и поднята тревога
             SetFacingPoint(GetPosition(oPC));
             SpeakString("А ну стой, ты что тут вынюхиваешь?!");
             AdjustReputation(oPC, oNPC, -100);
             DetermineCombatRound(oPC);
             }
            if (GetLocalInt(oNPC, "LOOK") != 1 && GetTag(oArm) == "AM_ITM_IRONTRON" &&
                GetLocalInt(oPC,"TRONE_ALARM") != 1)
             {
             SetLocalInt(oNPC, "LOOK", 1); // Ставим локалку что бы часто не болтали
             AssignCommand(oNPC, ClearAllActions());
             AssignCommand(oNPC, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
             DelayCommand(16.0f, SetLocalInt(oNPC, "LOOK", 0));
             int iRand = Random(10);
              switch (iRand)
              {
                    case 0:
                    {
                         SpeakString("Займись делом, солдат!"); break;
                    }
                    case 1:
                    {
                         SpeakString("Привет, ты новенький?"); break;
                    }
                    case 2:
                    {
                        SpeakString("Смотри, скоро прибудут боссы..."); break;
                    }
                    case 3:
                    {
                        SpeakString("Ты откуда выполз?"); break;
                    }
                    case 4:
                    {
                        SpeakString("Ты чего тут делаешь?"); break;
                    case 5:
                    {
                        SpeakString("Слушай, твои доспехи тебе не жмут?"); break;
                    case 6:
                    {
                        SpeakString("Иди на пост!"); break;
                    }
                     case 7:
                    {
                        SpeakString("Я твою рожу не помню что-то..."); break;
                    }
                     case 8:
                    {
                        SpeakString("Эй, ты свой ведь? Да?"); break;
                    }
                     AssignCommand(oNPC, ActionDoCommand(WalkWayPoints()));
               }
              }
            }
          }
        }
       }
    return;
}


Дальше, два скрипта для запуска диалога в котором участвует НПС которого вы атакуете и диалог начинается с определенного нр у НПС. Скрипты финального боя с воином в модуле 3.

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!  www.wrg.ru
//:: Name: oud_am_warrord
//:://////////////////////////////////////////////
/*
   UserDefined - СКРИПТ ЗАПУСКА СЦЕНЫ С ДАЛЛИКОМ
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan    Aiwan@e-mail.ru
//:: Created On: 26.02.2004
//:://////////////////////////////////////////////
void main()
{
int nEvent = GetUserDefinedEventNumber();
//======================= DAMAGED EVENT 1006 ===================================
if (nEvent == 1006)
  {
   object oPC = GetFirstPC(); // Опишите своего РС как вам надо.
   object oCat = GetHenchman(oPC);
   object oWord = OBJECT_SELF;
   object oSlave1 = GetObjectByTag("AM_SKELLETON_SLAVE_01"); // Скелет - Раб 1
   object oSlave2 = GetObjectByTag("AM_SKELLETON_SLAVE_02"); // Скелет - Раб 2
   object oWPTrone = GetObjectByTag("WP_TRONE_WARRIOR");
   int iCurHP = GetCurrentHitPoints(OBJECT_SELF);
   int iMaxHP = GetMaxHitPoints(OBJECT_SELF);
   int iD;
//==============================================================================
  if (!GetIsPC(oPC) || !GetLocalInt(oPC, "DALLIK_HELP"))
    {return;}
    int Class = GetClassByPosition(1, oPC); // При разных классах надо нанести разное повреждение
    switch (Class)
      {
      case CLASS_TYPE_BARBARIAN:{iD = 200; break;}
      case CLASS_TYPE_BARD:{iD = 300; break;}
      case CLASS_TYPE_CLERIC:{iD = 250; break;}
      case CLASS_TYPE_DRUID:{iD = 300; break;}
      case CLASS_TYPE_FIGHTER:{iD = 200; break;}
      case CLASS_TYPE_MONK:{iD = 150; break;}
      case CLASS_TYPE_PALADIN:{iD = 200; break;}
      case CLASS_TYPE_RANGER:{iD = 250; break;}
      case CLASS_TYPE_ROGUE:{iD = 300; break;}
      case CLASS_TYPE_SORCERER:{iD = 300; break;}
      case CLASS_TYPE_WIZARD:{iD = 300; break;}
      }

  if (GetIsPC(oPC) && ((iMaxHP - iD) >= iCurHP) && !GetLocalInt(oWord, "DALLIK_JAMP"))
   {
   SetLocalInt(oWord, "DALLIK_JAMP", TRUE);
   AssignCommand(oPC, ClearAllActions());
   AssignCommand(oCat, ClearAllActions());
   AssignCommand(OBJECT_SELF, ClearAllActions());
   AssignCommand(oSlave1, ClearAllActions());
   AssignCommand(oSlave2, ClearAllActions());
   ExecuteScript("am_chang_fr_warr", OBJECT_SELF); // Скрипт меняет репутацию у участников боя
// DelayCommand(0.5, ExecuteScript("am_scen_warr_03", oPC));
   }
  }
}


Вот сам скрипт смены репутации:
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!  www.wrg.ru
//:: name: am_chang_fr_warr
//:://////////////////////////////////////////////
/*
     ИЗМЕНЕНИЕ ФРАКЦИИ И ПЕРСОНАЛНЫХ ОТНОШЕНИЙ
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan    Aiwan@e-mail.ru
//:: Created On: 23.03.2004
//:://////////////////////////////////////////////
void main()
{
   object oPC = GetFirstPC();
   object oHen = GetHenchman(oPC);
   object oWord = GetObjectByTag("AM_WARRIOR_HORDE"); // Воин Орды
   object oSlave1 = GetObjectByTag("AM_SKELLETON_SLAVE_01"); // Скелет - Раб 1
   object oSlave2 = GetObjectByTag("AM_SKELLETON_SLAVE_02"); // Скелет - Раб 2
   location lClose = GetLocation(GetObjectByTag("AIWAN_CLOSE_ARENA")); //Скрыт.арена Aiwan'a
   object oNeutral = GetObjectByTag("AM_TRUE_NEUTRAL"); // Нейтральный НПС с фракцией ПОФИГИСТОВ
   ChangeFaction(oWord, oNeutral);
   ChangeFaction(oSlave1, oNeutral);
   ChangeFaction(oSlave2, oNeutral);
//--------------------------------------
   ClearPersonalReputation(oSlave1, oPC);
   ClearPersonalReputation(oPC, oSlave1);
   ClearPersonalReputation(oSlave1, oHen);
   ClearPersonalReputation(oHen, oSlave1);
//--------------------------------------
   ClearPersonalReputation(oSlave2, oPC);
   ClearPersonalReputation(oPC, oSlave2);
   ClearPersonalReputation(oSlave2, oHen);
   ClearPersonalReputation(oHen, oSlave2);
//--------------------------------------
   ClearPersonalReputation(oWord, oPC);
   ClearPersonalReputation(oPC, oWord);
   ClearPersonalReputation(oWord, oHen);
   ClearPersonalReputation(oHen, oWord);
}



СКРИПТ ЗАПРЕЩАЮЩИЙ МОНСТРАМ ВЫХОДИТЬ
ИЗ ЛОКАЦИИ ВСЛЕД ЗА ИГРОКОМ
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG
//:: a0_onareaexit
//:://////////////////////////////////////////////
/*
    СКРИПТ ЗАПРЕЩАЮЩИЙ МОНСТРАМ ВЫХОДИТЬ
        ИЗ ЛОКАЦИИ ВСЛЕД ЗА ИГРОКОМ
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan    Aiwan@e-mail.ru
//:: Created On: 21.04.2004
//:://////////////////////////////////////////////
void main()
{
  object oPC = GetEnteringObject();
  object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC);
  object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPC);
  object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPC);
  object oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC);
  object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC);
  object oJamp = GetTransitionTarget(OBJECT_SELF);
  //Чисто для моих земель, чтобы фамилиары не разгуливали где попало, пока их владельцы задумчиво стоят в области
  if (GetIsPC(oPC) && !GetIsPosessedFamiliar(oPC))
  {
  AssignCommand(oPC, JumpToObject(oJamp));
  AssignCommand(oAnimal, JumpToObject(oJamp));
  AssignCommand(oDominated, JumpToObject(oJamp));
  AssignCommand(oFamiliar, JumpToObject(oJamp));
  AssignCommand(oHenchman, JumpToObject(oJamp));
  AssignCommand(oSummoned, JumpToObject(oJamp));
  }
  else
  {
  //Иначе наши монстрyaшки будут задумчиво покачиваться у двери, совершенно беззащитные
  AssignCommand(oPC, ClearAllActions());
  }
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

5 страниц V  < 1 2 3 4 > » 
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 28th March 2024 - 22:17