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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
5 страниц V  < 1 2 3 4 5 >  
Ответить в эту темуОткрыть новую тему
> База скриптов, Готовые скрипты. Описание обязательно.
Lex
сообщение Mar 18 2005, 22:42
Сообщение #51


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ ДЯДЮШКИ MILEZ'А"

Автор:::::::::::::::::Milez::::::::::::::::::::::::::::::
May 22 2003
Cкрипт для смерти.
Вешать на OnPlayerDying модуля.
+ скрипта в том, что он не использует хартбит.
Это бета-версия скрипта предложена as is, автор не несет ответственности за материальный и моральные ущерб, который этот скрипт может кому-то принести!
Neverwinter Script Source
void DyingTicker(object oPC)
{
   int iHP=GetCurrentHitPoints(oPC);
   if (iHP>0) {
       RemoveEffect(oPC,EffectBlindness());
       DeleteLocalInt(oPC,"DyingDC");
       DeleteLocalInt(oPC,"STvsDeathSucceed");
       return;
   }
   int iDC;
   int iDam;
   int iSuc;
   if (iHP<-9) { ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDeath(TRUE,TRUE),oPC); }
   else {
       iDam=d4();
       iDC=GetLocalInt(oPC,"DyingDC");
       if (FortitudeSave(oPC,iDC)>0) {
           iDam=iDam/2;
           iSuc=GetLocalInt(oPC,"STvsDeathSucceed")+1;
           SetLocalInt(oPC,"STvsDeathSucceed",iSuc);
           if (iSuc>2) {
               FloatingTextStringOnCreature("Кровотечение прекратилось",oPC,FALSE);
               return;
           }
       }
       AssignCommand(oPC,DelayCommand(6.0,DyingTicker(oPC)));
       ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(iDam), oPC);
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectBlindness(),oPC,6.0);
       SetLocalInt(oPC,"DyingDC",iDC+1);
   }
}

void main()
{
   object oPC=GetLastPlayerDying();
   if (!GetIsPC(oPC)) return;
   SetLocalInt(oPC,"DyingDC",15);
   SetLocalInt(oPC,"STvsDeathSucceed",0);
   FloatingTextStringOnCreature("У менz открылось кровотечение",oPC,FALSE);
   DyingTicker(oPC);
}

Смысл в том, что каждый раунд (6 сек) игрок кидает спасбросок стойкости для половинного дамаджа от 1d4, при этом DC, который надо побить, увеличивается с каждым раундом на 1 (начальное значение 15). При удачном спасбраске 2 раза подряд кровотечение прекращается.
от 0 до -9 - игрок без сознание. От -10 и меньше - смерть без спасброска.

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

Автор:::::::::::::::::Milez::::::::::::::::::::::::::::::
May 24 2003

Вот температурный скрипт, полностью в соответсвии с D&D 3ed согласно разделам HEAT и COLD в DMG. Писан мной, любые совпадения в реализации с другими подобными скриптами являются чисто случайными. За общую идею создать нечто подобное спасибо ДБколлу. Подробнее об общем алгоритме работы см DMG (Температура, в отличие от DMG, приведена не в иноземных Фаренгейтах, а в старых добрых Цельсиях).
Всяческое использование, модификация, дебаггинг приветствуются! Никакой ответственности за причиненный моральный/материальный ущерб в результате работы скрипта автор не несет!

Вешать на OnEnter местности.
Neverwinter Script Source
void DealTemperatureDamage(object oPC)

{
   // Игрок без сознания
   if (GetCurrentHitPoints(oPC)<1) return;
   // Где находится игрок?
   object oArea=GetArea(oPC);
   // И какая там температура?
   int iT=GetLocalInt(oArea,"Temperature");
   // Температура комфортабельна или не установлена
   // (значение 0 рассматривается как неустановленная температура. Вместо 0 ставьте -1)
   if (((iT<=32) && (iT>=4)) || (iT==0)) return;
   // Определяем переменные
   int iDamType;
   int iDamAmount;
   int iSaveType;
   float iInterval;

   object oFire;
   int iFatigue=FALSE;
   int iFortSave;
   int i;
   effect eDam;
   // Носим тяжелую броню и/или плащ?
   int iCloth=(GetItemACValue(GetItemInSlot(INVENTORY_SLOT_CHEST,oPC))>5)
               ||GetIsObjectValid((GetItemInSlot(INVENTORY_SLOT_CLOAK,oPC)));
   // Сколько раз мы уже "стучали" по игроку?
   int iTimes=GetLocalInt(oPC,"TemperatureDamageTimer");
   int iDC=15+iTimes; // Подсчет DC
   if (iT>32) { // Жарко!
       FloatingTextStringOnCreature("Мне жарко!",oPC);
       iDamType=DAMAGE_TYPE_FIRE;
       iSaveType=SAVING_THROW_TYPE_FIRE;
       iDamAmount=d4();
       if (iCloth) iDC+=4; // -4 пенальти к спасброску аналогично +4 к DC (так как спасбросок делается встроенной функцией). При желание спасбросок можно делать вручную, но встроенная функция уж больно красиво пишет о спасброске в логах :)
       if (iT>60) { // Адская жарища!
       // 1d6 дамадж каждые 2 реальные секунды без спасброска
           eDam=EffectDamage(d6(),iDamType);
           ApplyEffectToObject(DURATION_TYPE_INSTANT,eDam,oPC);
           for (i=2;i<10;i+=2)
               AssignCommand(oPC,DelayCommand(IntToFloat(i),
               ApplyEffectToObject(DURATION_TYPE_INSTANT,eDam,oPC)));
           iFatigue=TRUE;
           iInterval=10.0;
       } else if (iT>43) { // Очччень жарко!
           iInterval=20.0;
           iFatigue=TRUE;
       } else { // Просто жарко
           iInterval=120.0;
       }
   } else if (iT<4) { // Холодно!
       // ищем костер
       oFire=GetNearestObjectByTag("ku_campfire",oPC);
       // Если рядом костер, но мы согреемся
       if ((GetIsObjectValid(oFire)) &&
           (GetDistanceBetween(oFire,oPC)<5.0)) {
           iDC=0;
           RemoveEffect(oPC,EffectSlow());
           iInterval=120.0;
       } else {
           iDamType=DAMAGE_TYPE_COLD;
           iSaveType=SAVING_THROW_TYPE_COLD;
           iDamAmount=d6();
           FloatingTextStringOnCreature("Мне холодно!",oPC);
           if (iT<-18) { // Жуткий мороз
               if (iCloth) iInterval=120.0; else iInterval=20.0;
               iFatigue=TRUE;
           } else { // Very cold
               if (iCloth) iDC=0; // Мы хорошо одеты и легкий морозец нам не страшен
               iInterval=120.0;
           }
       }
   }
   if (iDC>0){
       iFortSave=FortitudeSave(oPC,iDC,iSaveType);
       if (iFortSave==0) {
           ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(iDamAmount,iDamType),oPC);
           if (iFatigue) ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectSlow(),oPC,iInterval);
       }
   }
   SetLocalInt(oPC,"TemperatureDamageTimer",iTimes+1);
   AssignCommand(oPC,DelayCommand(iInterval,DealTemperatureDamage(oPC)));
}


void main()
{
   object oPC=GetEnteringObject();
   if (GetIsObjectValid(oPC)) {
       DeleteLocalInt(oPC,"TemperatureDamageTimer");
       AssignCommand(oPC,DealTemperatureDamage(oPC));
   }
}

где
ku_campfire - "синька" костра

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

Автор:::::::::::::::::Milez::::::::::::::::::::::::::::::
May 24 2003

Скрипт для "тягловых" животных. Легко переделывается для банка. Писано мной, любые совпадения с чьей-либо реализацией как в деталях так и в общем алгоритме чисто случайны. Всяческие изменения, доработки, дебаггинг приветствуются. За моральный/материальный ущерб в результате работы скрипта автор ответственности не несет!
На "тягловом" НПЦ (я использовал окса, но это может быть и хенчман, и фамильяр) в диалоге ставиться строчка наподобие "Перебрать поклажу". В Action Taken ставиться следующий скрипт:
Neverwinter Script Source
void main()
{
   object oPC=GetPCSpeaker();
   object oPackAnimal=OBJECT_SELF;
   location lLoc=GetLocation(oPC);
   object oContainer=CreateObject(OBJECT_TYPE_PLACEABLE,"inviscont",lLoc);
   object oEnum=GetFirstItemInInventory(oPackAnimal);
   SetLocalObject(oContainer,"LinkedPackAnimal",oPackAnimal);
   while (GetIsObjectValid(oEnum)) {
       CopyObject(oEnum,lLoc,oContainer);
       DestroyObject(oEnum);
       oEnum=GetNextItemInInventory(oPackAnimal);
   }
   AssignCommand(oPC,ClearAllActions());
   AssignCommand(oPC,ActionInteractObject(oContainer));
}

Создается "синька" врменного контейнера (я использовал за образец Invisible Object), на "синьке" ставяться аттрибуты Usable, Plot, Has Inventory. Имя синьки в данном случае "inviscont". В обработчик "синьки" OnClose ставиться следующий скрипт:
Neverwinter Script Source
void main()
{
   object oMaster=GetLocalObject(OBJECT_SELF,"LinkedPackAnimal");
   location lLoc=GetLocation(OBJECT_SELF);
   object oEnum=GetFirstItemInInventory();
   while (GetIsObjectValid(oEnum)) {
       CopyObject(oEnum,lLoc,oMaster);
       DestroyObject(oEnum);
       oEnum=GetNextItemInInventory();
   }
   DelayCommand(1.0,DestroyObject(OBJECT_SELF));
}


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

Автор:::::::::::::::::Milez::::::::::::::::::::::::::::::
May 27 2003
Гильдия Убийц.
(с) Оригинальная идея ONYX'а.
(с) Реализация Milez'а.
Система маленько запутанна, в модуле все взаимосвязано, здесь только основные скрипты, без диалогов и прочего.
Итак, есть айтем Контракт, в св-вах добавлено Cast: Unique Power Unlim Times/Day. Имя синьки contract.
Есть айтем Голова "клиента", в св-вах Cast: Unique Power Self Only Unlim Times/Day. Имя синьки headofclient.
В OnActivateItem модуля следующая бяка:
Neverwinter Script Source
location RandomLocationFrom(location lOrigin)
{
   vector vOrigin=GetPositionFromLocation(lOrigin);
   vOrigin.x+=(Random(11)-5);
   vOrigin.y+=(Random(11)-5);
   return Location(GetAreaFromLocation(lOrigin),vOrigin,GetFacingFromLocation(lOrigin));
}

void SummonKiller(object oClient,object oMaster)
{
   location lClient=RandomLocationFrom(GetLocation(oClient));
   ApplyEffectAtLocation(DURATION_TYPE_INSTANT,
       EffectVisualEffect(VFX_FNF_SMOKE_PUFF),lClient);
   object oKiller=CreateObject(OBJECT_TYPE_CREATURE,"gypsy007",lClient);
   SetLocalObject(oKiller,"MyClient",oClient);
   SetLocalString(oKiller,"MyClientName",GetName(oClient));
   SetLocalString(oKiller,"MyClientTag",GetTag(oClient));
   SetLocalObject(oKiller,"MyMaster",oMaster);
  & nbsp;DelayCommand(IntToFloat(Random(51)+50),AssignCommand(oKiller,ActionAttack(o
Client)));
}

void SummonKillers(object oClient,object oMaster,int iNumKillers)
{
   int i;
   for (i=1;i<=iNumKillers;i++) {
       SummonKiller(oClient,oMaster);
   }
}

void main()
{
   object oOwner=GetItemActivator();
   if (!GetIsPC(oOwner)) return;
   object oSource=GetItemActivated();
   object oTarget=GetItemActivatedTarget();
   string sSourTag=GetTag(oSource);
   if (sSourTag=="contract") {
       int iNumOfKillers=GetLocalInt(oSource,"NumberOfKillers");
       if (iNumOfKillers<1) {
           DestroyObject(oSource);
       } else
       if ((GetObjectType(oTarget)==OBJECT_TYPE_CREATURE) && (!GetIsDM(oTarget)) && (!GetPlotFlag(oTarget)))
      {
           FloatingTextStringOnCreature("The murder have been assigned!",oOwner,FALSE);
           DelayCommand(IntToFloat(Random(51)+50),
               SummonKillers(oTarget,oOwner,iNumOfKillers));
           DestroyObject(oSource);
       } else {
           FloatingTextStringOnCreature("The murder can't be assigned to an item, DM or plot character!",oOwner,FALSE);
       }
   } else if (sSourTag=="headofclient") {
       FloatingTextStringOnCreature("This is the head of "+
           GetLocalString(oSource,"Client"),oOwner,FALSE);

   }
}

Персонажи:
Наемник (типа главарь). В его диалоге уставливается кол-во убийц для задания, забираются деньги у игрока,
дается контракт (CreateItemOnObject("contract",oPC)).
Кол-во убийц-исполнителей должно писаться на контракте (SetLocalInt(oContract,"NumberOfKillers",xxx))
Убийца. Собственно исполнитель. Имя синьки "gypsy007". В OnHeartbeat убийцы такая бяка:
Neverwinter Script Source
void main()
{
   object oClient=GetLocalObject(OBJECT_SELF,"MyClient");
   object oMaster=GetLocalObject(OBJECT_SELF,"MyMaster");
   object oMessenger;
   string sNotifyVar;
   if ((!GetIsObjectValid(oClient)) || GetIsDead(oClient)) {
       if (GetIsObjectValid(oMaster)) {
           sNotifyVar="Notified"+GetLocalString(OBJECT_SELF,"MyClientTag");
           if (GetLocalInt(oMaster,sNotifyVar)!=TRUE) {
               oMessenger=CreateObject(OBJECT_TYPE_CREATURE,"halfmerc002",
                   GetLocation(oMaster),TRUE);
               SetLocalObject(oMessenger,"MyMaster",oMaster);
               SetLocalString(oMessenger,"MyClient",GetLocalString(OBJECT_SELF,"MyClientName"));
               SetLocalString(oMessenger,"NotifyVar",sNotifyVar);
               SetLocalInt(oMaster,sNotifyVar,TRUE);
           }
       }
       DestroyObject(OBJECT_SELF);
   }
}

Вестник Гильдии Убийц. После исполнения задания доставляет заказчику голову жертвы. Имя синьки "halfmerc002".
Диалог длинный, хитрый и может быть любым. Основной скрипт который должен быть для отдавания головы жертвы следующий:
Neverwinter Script Source
void main()
{
   object oPC=GetPCSpeaker();
   object oHead=CreateItemOnObject("headofclient",oPC);
   SetLocalString(oHead,"Client",GetLocalString(OBJECT_SELF,"MyClient"));
   SetLocalObject(oHead,"Master",oPC);
   DeleteLocalInt(oPC,GetLocalString(OBJECT_SELF,"NotifyVar"));
}

Работа скрипта: игрок говорит с Наемником и просит его убрать какого-либо игрока/неписю.
Наемник спрашивает сколько посылать убийц и в зависимости от их кол-ва устанавливает цену,
если игрок согласен и у него хватает денег, то игроку дается контракт и забираются деньги.
Потом контракт используется на том неписе/игроке которого надо "убрать", после чего через 50-100 секунд
(DelayCommand(IntToFloat(Random(51)+50),... Впрочем это можно регулировать) около "клиента" материализуется энное кол-во убийц. Они атакуют жертву (убийцы у меня в спец. фракции Killer, которая нейтральна ко всем, так что атакуют они только намеченную жертву, но это можно менять) и если жертва успешно убивается, то к заказчику направляется гонец (если жертва выживает, то значит убийцы умирают и посылать гонца некому) и убийцы бесследно смываются с места преступления. Игрок говорит с посыльным и получает голову "клиента". Если использовать эту голову, то игроку-заказчику напишет чья это голова.
Вот и все.

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

Автор:::::::::::::::::Milez::::::::::::::::::::::::::::::
May 14 2003
Это система отдыха в моем модуле (модуль пока еще не вышел из стадии первичной разработки поэтому о нем пока ни гу-гу).
Навеяно системой отдыха из Axistown'а но полностью писано мной

kel_rest
Neverwinter Script Source
void DestroyFirecamp(object oCampFire=OBJECT_SELF)
{
// Создаем обгорелое пятно на месте костра и гасим костер
   object oLandMark=CreateObject(OBJECT_TYPE_PLACEABLE,"plc_weathmark",GetLocation(oCampFire));
// Пятно исчезает через 120 секунд (2 реальных минуты, 1 игровой час). Менять по вкусу
   AssignCommand(oLandMark,DelayCommand(120.0,DestroyObject(oLandMark)));
   DestroyObject(oCampFire);
}

void ApplyRestEffect(object oTarget=OBJECT_SELF)
{
// Создаем эффекты сна. Функцию править по вкусу.
   effect eSleep=EffectBlindness();

   if (GetRacialType(oTarget)==RACIAL_TYPE_ELF)
   {
// Эльфы не спят, а впадают в транс (см. описание эльфов в D&D 3ed)
       if (GetGender(oTarget)==GENDER_FEMALE)
           FloatingTextStringOnCreature("Я вошла в транс",oTarget,FALSE);
       else
           FloatingTextStringOnCreature("Я вошел в транс",oTarget,FALSE);
   } else

       eSleep=EffectLinkEffects(eSleep,EffectVisualEffect(VFX_IMP_SLEEP));
// Эффект сна на 30 секунд. Менять по желанию.
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSleep,oTarget,30.0);
}

object FindFood(object oTarget=OBJECT_SELF)
{
   object oEnum=GetFirstItemInInventory(oTarget);
   while (GetIsObjectValid(oEnum) && (GetTag(oEnum)!="KEL_FOOD"))
       oEnum=GetNextItemInInventory(oTarget);
   return oEnum;
}


ku_makecamp (вешать на OnUsed дров)
Neverwinter Script Source
#include "kel_rest"

void main()
{
   object oPC=GetLastUsedBy();
   if (!GetIsPC(oPC)) return;
   object oTorch=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
   if (GetIsObjectValid(oTorch) &&
          (GetTag(oTorch) == "NW_IT_TORCH001") &&
// Флаг, висящий на области (например в таверне) и позволяющий отдыхать бесплатно
          (GetLocalInt(GetArea(oPC),"NoCampArea") != TRUE)) {
       object oFire=CreateObject(OBJECT_TYPE_PLACEABLE,"ku_campfire",GetLocation(OBJECT_SELF));
       DestroyObject(OBJECT_SELF);
// Огонь гаснет через 900 секунд (15 реальных минут или 7,5 игровых часов)
// Менять по желаю
       AssignCommand(oFire,DelayCommand(900.0,DestroyFirecamp(oFire)));
   } else {
       CreateItemOnObject("kel_wood",oPC);
       DestroyObject(OBJECT_SELF);
   }
}


kua_dropwood (вешать OnUnAquiredItem модуля)
Neverwinter Script Source
void main()
{
   object oPC=GetModuleItemLostBy();
   if (!GetIsPC(oPC)) return;
   object oItem=GetModuleItemLost();
   if (!GetIsObjectValid(oItem)) return;
   string sResRef=GetTag(oItem);
   if (sResRef=="KEL_WOOD")
   {
// Пропатчено by Milez on 14/05/2003, по намекам некоего Guest
       if (GetIsObjectValid(GetAreaFromLocation(GetLocation(oItem)))) {
           CreateObject(OBJECT_TYPE_PLACEABLE,"ku_woodpile",GetLocation(oItem));
           DestroyObject(oItem);
       }
   }
}


kr_resteffect (вешать на OnRested модуля)
Neverwinter Script Source
#include "kel_rest"
void main()
{
   object oPC=GetLastPCRested();
   if (GetCurrentAction(oPC)!=ACTION_REST) return;
   int iFreeRest=GetLocalInt(GetArea(oPC),"FreeRestArea");
   if (iFreeRest) ApplyRestEffect(oPC);
   else {
       object oCampFire=GetNearestObjectByTag("ku_campfire",oPC);
// нельзя отдыхать дальше 3 метров от костра (расстояние менять по вкусу)
       if (GetIsObjectValid(oCampFire) && (GetDistanceBetween(oPC,oCampFire)<=3.0)) {
           object oFood=FindFood(oPC);
           if (GetIsObjectValid(oFood)) {
               DestroyObject(oFood);
               ApplyRestEffect(oPC);
           } else {
               FloatingTextStringOnCreature("Мне надо перекусить",oPC,FALSE);
               AssignCommand(oPC,ClearAllActions());
           }
       } else {
           FloatingTextStringOnCreature("Я не могу отдыхать далеко от костра",oPC,FALSE);
           AssignCommand(oPC,ClearAllActions());
       }
   }
}


khb_cfire_sfx (на OnHeartbeat костра, исключительно для красоты, можно не использовать в целях повышения скорости работы кода)
Neverwinter Script Source
void main()
{
   PlaySound("al_cv_firecamp1");
}



Используемые "синьки":
KEL_WOOD - дрова как айтем в инвентаре
ku_woodpile - горка дров как плэйсабл айтем на земле
ku_campfire - сам костер
KEL_FOOD - еда

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


Автор:::::::::::::::::Milez::::::::::::::::::::::::::::::
May 29 2003
"Приведем НВН в соответствие с АДиД". На повестке дня скрипт для ветра. Ниже базовый инклуд. Основная функция - ApplyWindEffect.
Параметры:
int iWindForce - сила ветра: 0 - Light wind; 1 - Moderate wind; 2 - Strong wind; 3 - Severe wind; 4 - Windstorm; 5 - Hurricane force wind; 6 - Tornado.
Neverwinter Script Source
float fWindDirection
- направление ветра, угол.
Neverwinter Script Source
object oTarget
- на кого "подуть"
Рекомендуется использовать в Heartbeat'е, перебирая всех игроков, так как по АДиД эти проверки должны проходить каждый раунд. Реально в хартбите использовать можно например так:
Neverwinter Script Source
void main()
{
   object oPC=GetFirstPC();
   while (GetIsObjectValid(oPC)) {
       ApplyWindEffect(4,45.0,oPC);
       oPC=GetNextPC();
   }
}

Работает в соответствии с соответствующим разделом DMG.
Ниже собственно сам инклуд.
Neverwinter Script Source
vector BlowAwayTo(vector vOrigin,float fAngle,float fRange)
{
   float dx=fRange*cos(fAngle);
   float dy=fRange*sin(fAngle);
   return Vector(vOrigin.x+dx,vOrigin.y+dy,vOrigin.z);
}

// "Сдувание". Сбивание с ног + отбрасывание на 1d4*10 футов с 1d4 дамаджа на каждые 10 футов.
void ApplyBlowAwayEffect(float fWindDirection,object oTarget=OBJECT_SELF)
{
   int iRange=d4();
   int iDam=d4(iRange);
   iRange *= 10;
   float fRange=FeetToMeters(IntToFloat(iRange));
   vector vNewPos=BlowAwayTo(GetPosition(oTarget),fWindDirection,fRange);
   AssignCommand(oTarget,ClearAllActions(TRUE));
   AssignCommand(oTarget,JumpToLocation(Location(GetArea(oTarget),vNewPos,GetFacin
g(oTarget))));
   AssignCommand(oTarget,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectKnockdown(),oTarget,6.0));
   ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(iDam),oTarget);
   PrintVector(vNewPos,TRUE);
}

void ApplyWindEffect(int iWindForce,float fWindDirection,object oTarget=OBJECT_SELF)
{
if (iWindForce<1) return;
object oTorch=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oTarget);

if (GetBaseItemType(oTorch)==BASE_ITEM_TORCH) {
   if (iWindForce==1) { // Moderate wind имеет 50% шанс погасить незащищенный огонь (факел)
       if (d2()==1) ActionUnequipItem(oTorch);
       return;
   } else { ActionUnequipItem(oTorch); } // Stronger winds extinguish fire at 100%
} else if (iWindForce==1) return; // If there's no lit torch moderate wind doesn't do any effect

int iCreatureSize=GetCreatureSize(oTarget);
// Так как мы будем накладывать пенальти на удаленные атаки, мы вызнаем, держит ли чар метательное/стреляющее оружие
int iWpnType=GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oTarget));
int iFeet;
vector vVec;
int bRangeWpn=FALSE;

if (iWpnType!=BASE_ITEM_INVALID) {
   bRangeWpn=(iWpnType==BASE_ITEM_DART)||
             (iWpnType==BASE_ITEM_HEAVYCROSSBOW)||
             (iWpnType==BASE_ITEM_LIGHTCROSSBOW)||
             (iWpnType==BASE_ITEM_LONGBOW)||
             (iWpnType==BASE_ITEM_SHORTBOW)||
             (iWpnType==BASE_ITEM_SHURIKEN)||
             (iWpnType==BASE_ITEM_SLING)||
             (iWpnType==BASE_ITEM_THROWINGAXE);
}

switch (iWindForce) {
case 2: // Strong wind
   if (bRangeWpn)
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectAttackDecrease(2),oTarget,6.0);
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
   EffectSkillDecrease(SKILL_LISTEN,2),oTarget,6.0);

   if (iCreatureSize==1) // оч. маленькое существо (Tiny)
       if (FortitudeSave(oTarget,10)==0)
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectKnockdown(),oTarget,3.0);
break;
case 3: // Severe wind
   if (bRangeWpn)
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectAttackDecrease(4),oTarget,6.0);
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
   EffectSkillDecrease(SKILL_LISTEN,4),oTarget,6.0);

   if (iCreatureSize<4)
   if (FortitudeSave(oTarget,15)==0)
   switch (iCreatureSize) {
   case 3: // Среднее существо (Medium).
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectEntangle(),oTarget,6.0);
   break;
   case 2: // Маленькое сущ-во (Small)
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectKnockdown(),oTarget,6.0);
   break;
   case 1:
       ApplyBlowAwayEffect(fWindDirection,oTarget);
   }
break;
case 4: // Windstorm
   if (bRangeWpn)
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectAttackDecrease(50),oTarget,6.0);
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
   EffectSkillDecrease(SKILL_LISTEN,8),oTarget,6.0);

   if (iCreatureSize<6)
   if (FortitudeSave(oTarget,18)==0)
   switch (iCreatureSize) {
   case 3:
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectKnockdown(),oTarget,6.0);
   break;
   case 4: // Большое (Large)
   case 5: // или огромное сущ-во (Huge)
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectEntangle(),oTarget,6.0);
   break;
   case 2:
   case 1:
       ApplyBlowAwayEffect(fWindDirection,oTarget);
   break;
   }
break;
case 5: // Hurricane force wind
   if (bRangeWpn)
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectAttackDecrease(50),oTarget,6.0);
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
   EffectSkillDecrease(SKILL_LISTEN,50),oTarget,6.0);

   if (iCreatureSize<6)
   if (FortitudeSave(oTarget,20)==0)
   switch (iCreatureSize) {
   case 3:
   case 2:
   case 1:
       ApplyBlowAwayEffect(fWindDirection,oTarget);
   break;
   case 4:
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectKnockdown(),oTarget,6.0);
   break;
   case 5:
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectEntangle(),oTarget,6.0);
   break;
   }
break;
case 6: // Tornado (WOW!)
   if (bRangeWpn)
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectAttackDecrease(50),oTarget,6.0);
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
   EffectSkillDecrease(SKILL_LISTEN,50),oTarget,6.0);
   if ((iCreatureSize==5) && (FortitudeSave(oTarget,30)==0))
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectKnockdown(),oTarget,6.0);
   else { // Торнадо особый случай. Он не сбивает с ног, а засасывает на 1d10 раундов, давая 6d6 дамаджа за раунд
       iFeet=GetLocalInt(oTarget,"IsInTornado");
       if (iFeet<1)
           if (FortitudeSave(oTarget,30)==0) iFeet=d10();
       if (iFeet>0) {
           iFeet-=1;
// По АДиД жерло торнадо движется с линейной скоростью 30 миль в час.
// В пересчете на реальные для НВН значения получаются астрономические цифры, кроме того летание
// в НВН нормально не сделаешь, поэтому я предположил что торнадо каждый раунд кидает чара в случайное
// место в радиусе 10 метров от текущего местоположения. Садисты это значение могут увеличить
           vVec=GetPosition(oTarget);
           vVec.x+=Random(21)-10;
           vVec.y+=Random(21)-10;
           AssignCommand(oTarget,ClearAllActions(TRUE));
           AssignCommand(oTarget,JumpToLocation(Location(GetArea(oTarget),vVec,GetFacing(o
Target))));
           AssignCommand(oTarget,ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
               EffectKnockdown(),oTarget,6.0));
           ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(d6(6)),oTarget);
       }
       SetLocalInt(oTarget,"IsInTornado",iFeet);
   }
break;
}
}

Кроме того сила ветра 3 (Severe wind) соответствует спеллу Gust of Wind, так что кому не в терпеж ждать этого спелла в SoU можете заюзать этот скрипт для создание этого спелла вручную
Смотреть spells.2da, там прописаны данные по спеллам, включая скрипты, эти спеллы реализующие.

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


Автор:::::::::::::::::Milez::::::::::::::::::::::::::::::
Jun 8 2003
Как и обещал, скрипт для осадков. Прошу прощения за такую задержку: только начались экзамены, просто не было времени. Писано как всегда мной, теперь уже по готовому шаблону (см. ветер, кстати, этот шаблон очень удобно использовать во многих случаях, может кому пригодиться). Ниже только функция, использовать можно так же, как скрипт на ветер.
Все сделано по DMG AD&D 3ed.
Neverwinter Script Source
int PRECIPITATION_RAIN=1;
int PRECIPITATION_SNOW=2;
int PRECIPITATION_SLEET=3;
int PRECIPITATION_HAIL=4;

void ApplyPrecipitationEffect(int iPrecType,object oTarget=OBJECT_SELF)
{
object oTorch=GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oTarget);
if (GetBaseItemType(oTorch)==BASE_ITEM_TORCH) ActionUnequipItem(oTorch);
int iWpnType=GetBaseItemType(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oTarget));
int bRangeWpn=FALSE;

if (iWpnType!=BASE_ITEM_INVALID) {
   bRangeWpn=(iWpnType==BASE_ITEM_DART)||
             (iWpnType==BASE_ITEM_HEAVYCROSSBOW)||
             (iWpnType==BASE_ITEM_LIGHTCROSSBOW)||
             (iWpnType==BASE_ITEM_LONGBOW)||
             (iWpnType==BASE_ITEM_SHORTBOW)||
             (iWpnType==BASE_ITEM_SHURIKEN)||
             (iWpnType==BASE_ITEM_SLING)||
             (iWpnType==BASE_ITEM_THROWINGAXE);
}

switch(iPrecType) {
case 3: //PRECIPITATION_SLEET - морось
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
   EffectMovementSpeedDecrease(50),oTarget,7.0);
case 1: //PRECIPITATION_RAIN - дождь
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
   EffectSkillDecrease(SKILL_SPOT,4),oTarget,7.0);

   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
   EffectSkillDecrease(SKILL_SEARCH,4),oTarget,7.0);

   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
   EffectSkillDecrease(SKILL_LISTEN,4),oTarget,7.0);

   if (bRangeWpn)
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectAttackDecrease(4),oTarget,7.0);
break;
case 2: //PRECIPITATION_SNOW - снег
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
   EffectMovementSpeedDecrease(50),oTarget,7.0);

   if (bRangeWpn)
       ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
       EffectAttackDecrease(4),oTarget,7.0);

   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
   EffectSkillDecrease(SKILL_SPOT,4),oTarget,7.0);

   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
   EffectSkillDecrease(SKILL_SEARCH,4),oTarget,7.0);
break;
case 4: //PRECIPITATION_HAIL - град
   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
   EffectMovementSpeedDecrease(50),oTarget,7.0);

   ApplyEffectToObject(DURATION_TYPE_TEMPORARY,
   EffectSkillDecrease(SKILL_LISTEN,4),oTarget,7.0);

   if (d100()<=5) {
       ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(1,DAMAGE_TYPE_BLUDGEONIN
G),oTarget);
       SendMessageToPC(oTarget,"Здороваz градина внезапно стукнула тебz по голове.");
   }
break;
}
}

Это предпоследний скрипт из цикла скриптов, реализующих окружающую среду по АДиД. Последним будет скрипт для штормов, но там уже в принципе все просто: это в основном смесь осадков и ветра.

************************************************************************************
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 18 2005, 23:50
Сообщение #52


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ ДЯДЮШКИ MILEZ'А"

Автор:::::::::::::::::Milez::::::::::::::::::::::::::::::
Jun 29 2003
Еще один спавн. Фишка в том, что респавн существ основан на вероятностом законе, а не на времени, через которое спавн должен происходить. Может кому пригодиться.
Основной скрипт на Heartbeat плейсабла, играющего роль спавна:
Neverwinter Script Source
void main()
{
   object oSelf=OBJECT_SELF;
   object oPC=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC);
   if (!GetIsObjectValid(oPC)) return;
   float fActDist=IntToFloat(GetMaxHitPoints()); // расстоЯние, на к-ом должен поЯвитьсЯ игрок от спавна, чтобы тот заработал
   if (GetDistanceBetween(oPC,oSelf)>fActDist) return;
   int iSpawnDist=GetReflexSavingThrow(oSelf); // макс. расст-ие, на к-ом будут поЯвлЯться сущ-ва
   int iSpawnChance=GetWillSavingThrow(oSelf); // вероЯтность поЯвлениЯ существа, %
   int iMaxSpawn=GetFortitudeSavingThrow(oSelf); // макс. кол-во сущ-в, поддерживаемых спавном
   int iSpawned=GetLocalInt(oSelf,"SpawnedCreatures");
   object oMonster;
   string sMonster;
   float fSpawnAngle;
   float fSpawnDist;
   vector vSpawnPlace;
   location lSpawnLoc;
   if (iSpawned<iMaxSpawn) {
       if (d100()<=iSpawnChance) {
           iSpawned++;
           fSpawnDist=IntToFloat(Random(iSpawnDist)+1);
           fSpawnAngle=IntToFloat(Random(360));
           vSpawnPlace=GetPosition(oSelf);
           vSpawnPlace.x+=fSpawnDist*cos(fSpawnAngle);
           vSpawnPlace.y+=fSpawnDist*sin(fSpawnAngle);
           lSpawnLoc=Location(GetArea(oSelf),vSpawnPlace,IntToFloat(Random(360)));
// Здесь вставьте подобным образом список сущ-в, которые будут спавнитьсЯ
           switch (Random(2)) {
           case 0:
               sMonster="nw_skeleton";
           break;
           case 1:
               sMonster="nw_zombie01";
           break;
           }
           oMonster=CreateObject(OBJECT_TYPE_CREATURE,sMonster,lSpawnLoc);
           SetLocalObject(oMonster,"MySpawner",oSelf);
           SetLocalObject(oSelf,"LastMonsterSpawned",oMonster);
       }
   }
   SetLocalInt(oSelf,"SpawnedCreatures",iSpawned);
}


В OnUserDefined стандартного скрипта nw_c2_defaultd добавим обработчик на событие 1007 (смерть), для регистрации смерти существа на мастер-спавне:
Neverwinter Script Source
...
object oSpawnPoint;
switch(iEvent) {
...
case 1007:
       oSpawnPoint=GetLocalObject(OBJECT_SELF,"MySpawner");
       if (GetIsObjectValid(oSpawnPoint)) {
           SetLocalInt(oSpawnPoint,"SpawnedCreatures",GetLocalInt(oSpawnPoint,"SpawnedCreatures")-1);
       }
   break;
...
}


Модификации возможны самые разные. Можно добавить флаг на макс. спавн, чтобы спавн работал только 1 раз, можно внести ограничения по времени. Короче, делайте что хотите
Настраивается спавн до обидног просто:
с св-вах плейсабла-спавна (я использовал невидимый объект) ставите:
Max Hit Points - расстояние, на котором должен появиться игрок, чтобы спавн заработал.
Reflex Save - макс. расст-ие от спавна, на котором будут создаваться сущ-ва.
Fortitude Save - макс. кол-во существ, к-ое будет поддерживаться спавном.
Will Save - вероятность того, что существо будет создано при каждом данном вызове скрипта, в процентах (100 - существа будут спавниться всегда, 0 - спавн отключен. 100 используйте очень осторожно: спавн будет постоянно поддерживать популяцию монстров, игрок просто может не успеть всех прибить!)

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

Автор:::::::::::::::::Milez::::::::::::::::::::::::::::::
Feb 24 2004
Ээээх, давно я тут не писал. Времени скриптовать не было. И вот жизнь подладилась, вышла ХотУ и... Сбылась мечта идиота! Я наконец-то смог сделать нормального призрака!
Вот функция:
Neverwinter Script Source
void SetGhostState(object oPC)
{
   // polymorph, so we can't equip/use things, cast spells etc.
   effect eGhost = EffectPolymorph(POLYMORPH_TYPE_SPECTRE,TRUE);
   // this way we can pass thru other mobs
   eGhost = EffectLinkEffects(EffectCutsceneGhost(),eGhost);
   // ghosts are invisible, you know
   eGhost = EffectLinkEffects(EffectInvisibility(INVISIBILITY_TYPE_DARKNESS),eGhost);
   // ghosts can't attack as well
   eGhost = EffectLinkEffects(EffectDazed(),eGhost);
   // others can't detect ghosts, no way!
   eGhost = EffectLinkEffects(EffectEthereal(),eGhost);
   // these effects can't be dispelled, as well as they can't be removed by rest
   eGhost = SupernaturalEffect(eGhost);

   ApplyEffectToObject(DURATION_TYPE_PERMANENT,eGhost,oPC);
   SetPlotFlag(oPC,TRUE); // ghosts are invincible
   SetLocalInt(oPC,"IAmAGhost",1);
}

Ставим ее на OnDeath, а скрипт ресурректа правим так, чтобы, будучи скастованным на чара, проверял соотв-ую лок. переменную и, если надо, "оживлял" чара, скидывая эффкты.

КОНЕЦ ЦИКЛА "СКРИПТЫ ДЯДЮШКИ MILEZ'А" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 01:06
Сообщение #53


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ ДЯДЮШКИ _kaa_"

Автор:::::::::::::::::_kaa_::::::::::::::::::::::::::::::
Feb 24 2004
По поводу защиты чаров от хака. Вот простая реализация, привязывает конкретный аккаунт и имя персонажа к СД-КЕЮ. Есть возможность ДМ-ом отключить защиту на некоторое время (например сменили СД-КЕЙ и не могут попасть на шард)
Все ключи хранятся в базе данных на сервере.
Neverwinter Script Source
void main()
{
object oPC = GetEnteringObject();
string sCDKEY = GetPCPublicCDKey(oPC);
string sName = GetName(oPC);
string sPCName = GetPCPlayerName(oPC);
//Зачем нужны скобки (или вообще любые символы) - думайте сами.
string sID = "("+sPCName+")"+sName;
int SecurityDisabled = GetLocalInt(GetModule(),"SecurityDisable");
//if (GetIsDM(oPC)) return;
WriteTimestampedLogEntry("Security: "+sName+" :["+sPCName+"]: with key ="+sCDKEY);
string sReadID = GetCampaignString("Security",sID);
// ЕСЛИ НОВЫЙ ИЛИ ПРОВЕРКА ОТКЛЮЧЕНА - ПЕРЕЗАПИСЫВАТЬ КЛЮЧИ
if (sReadID =="" || SecurityDisabled)
   SetCampaignString("Security",sID,sCDKEY);
if (sReadID != sCDKEY && sReadID !="" && !SecurityDisabled)
   {
    BootPC(oPC);
    SendMessageToAllDMs("Security: Error! "+sName+" :["+sPCName+"]: with key ="+sCDKEY+ " != "+sReadID);
    WriteTimestampedLogEntry("Security: Error! "+sName+" :["+sPCName+"]: with key ="+sCDKEY+ " != "+sReadID);
   }
else
   WriteTimestampedLogEntry("Security: Check ok.");
}

Чтобы отключить на время защиту - из ДМ-клиента в консоли набираете:
dm_setmodulevarint SecurityDisable 1
включить обратно :
dm_setmodulevarint SecurityDisable 0

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

Автор:::::::::::::::::_kaa_::::::::::::::::::::::::::::::
Oct 3 2003
Скрипт для магазинов. Проверяет наличие такого товара в магазине, если уже есть - то после продажи удаляет. Нужен на шардах, где мазагины со временем забиваются ловушками, камнями и т.п. - при наличии более 10 страниц ассортимента в магазине начинаются заметные торможения сервера, проверенно.
Только одно требования к самим магазинам. В теге должно содержаться слово "_SHOP" (//Иначе нельзя узнать, магазин это или нет). - Вру ведь и никто не видит %)
Есть функция узнать тип объекта GetObjectType();
Вызывать из события модуля OnUnAcquireItem
Проще всего добавить в уже существующий обработчки строку:
ExecuteScript("at_check_dupe",OBJECT_SELF);

Сам скрипт:
at_check_dupe
Neverwinter Script Source
void main()
{
object oLostItem = GetModuleItemLost();
object oLostBy = GetModuleItemLostBy();
object oNewPosessor = GetItemPossessor(oLostItem);

if (FindSubString(GetStringUpperCase(GetTag(oNewPosessor)),"_SHOP"))
   {
    int n = 0;
    object oItem = GetFirstItemInInventory(oNewPosessor);
    while (GetIsObjectValid(oItem))
        {
          if (GetTag(oLostItem) == GetTag(oItem)) n++;
          if (n>1)
               {
                 DestroyObject(oLostItem);
                 break;
               }
          oItem = GetNextItemInInventory(oNewPosessor);
        }
   }
}


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

Автор:::::::::::::::::_kaa_::::::::::::::::::::::::::::::
Jan 30 2004
Из нового.
Реализация кольца духа - при надевании игрок становится полупрозрачным и может проходить сквозь других игроков. При снятии - эффект пропадает.
При желании можно добавить и неузвимость (не стал делать, ибо нефиг).
Для эффекта рекомендую добавить DayToNight() при надевании и наоборот.
на событие модуля onPlayerEquipItem()
Neverwinter Script Source
void main()
{
object oPC = GetPCItemLastEquippedBy();
object oItem = GetPCItemLastEquipped();
if (GetTag(oItem) == "mg_it_ringghost")
   {
   effect E = EffectCutsceneGhost();
   E = EffectLinkEffects(EffectEthereal(),E);
   ApplyEffectToObject(DURATION_TYPE_PERMANENT,E,oPC);
   }
}
[/nss

на onPlayerUnEquipItem()
[nss] 
void FindAndRemoveGhostEffect(object O)
{
effect e = GetFirstEffect(O);
while (GetIsEffectValid(e))
   {
   if (GetEffectType(e) == EFFECT_TYPE_CUTSCENEGHOST)
       RemoveEffect(O,e);
   if (GetEffectType(e) == EFFECT_TYPE_ETHEREAL)
       RemoveEffect(O,e);
   e = GetNextEffect(O);
   }
void main()
{
object oPC = GetPCItemLastUnequippedBy();
object oItem = GetPCItemLastUnequipped();
// кольцо духа
if (GetTag(oItem) == "mg_it_ringghost")
   {
   FindAndRemoveGhostEffect(oPC);
   }

где mg_it_ringghost - тег кольца.
написанно вчера для Мидгарда.

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

Автор:::::::::::::::::_kaa_::::::::::::::::::::::::::::::
Mar 25 2004
Расцветка сообщений, выводимых SendMessageToPC()
Работает все примерно так: есть тег <cRGB> и парный ему </c>
RGB - это три символа, ascii код каждого - это значение соответствующей цветовой компоненты.
Посколько многие символы нельзя использовать в скиптах, я взял " " (пробел) (32) и букву "ю" (254) как минимум и максимум.
После использования тега раскраски - закрывайте тег в помощью s_end()
Мне было достаточно 4 цветов, вот самый простейший код:
Neverwinter Script Source
string s_green() 
{     
return "<c ю >"
}   
string s_blue()
{     
return "<c  ю>"
}   
string s_red() 
{     
return "<cю  >"
}   
string s_white() 
{     
return "<cююю>"

string s_end() 
{     
return "</c>"
}


Вроде можно и в диалогах через SetCustomToken

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

Автор:::::::::::::::::_kaa_::::::::::::::::::::::::::::::
Mar 26 204
Простейшая реализация двумерного массива (очень полезен при кэширование .2da таблиц).
Ограничение - размерность, поставил 0..999

Neverwinter Script Source
//Add string S to array O[X,Y]
void _arr_SetStringXY(object O, int X,int Y,string S,string Prefix="_arr");
//Get string S from array O[X,Y]
string _arr_GetStringXY(object O, int X,int Y,string Prefix="_arr");
string _arr_AddNull(int I)
{
   string result = "";
   if (I<10) result+="0";
   if (I<100) result+="0";
   result += IntToString(I);
   return result;
}

void _arr_SetStringXY(object O, int X,int Y,string S,string Prefix="_arr")
{
   SetLocalString(O,Prefix+_arr_AddNull(X)+_arr_AddNull(Y),S);
}

string _arr_GetStringXY(object O, int X,int Y,string Prefix="_arr")
{
   return GetLocalString(O,Prefix+_arr_AddNull(X)+_arr_AddNull(Y));
}


ps. Многие не знают, поэтому добавлю:
Если вы описываете кроме самой функции ее прототип - это дает вам а) право использовать функцию в рекурсивных вызовах б) при дабл клике на функции выдаст описание этой функции (все то, что выше прототипа)

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

КОНЕЦ ЦИКЛА "СКРИПТЫ ДЯДЮШКИ _kaa_" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 13:56
Сообщение #54


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ ДЯДЮШКИ DBCOLL'A"

автор::::::::::::DBColl::::::::::::::::::::
May 7 2003
скрипт на первое использование рычага отпирает и открывает дверь, на второе закрывает и захлопывает ее и тд.
На "OnUsed" рычага
Neverwinter Script Source
void main()
{
object oDoor=GetNearestObjectByTag("ТЭГ_ДВЕРИ");
if(GetIsOpen(oDoor)) // если она открыта
   {
    AssignCommand(OBJECT_SELF,ActionCloseDoor(oDoor));
    // захлопнуть дверь. действие привязанно к рычагу.
    SetLocked(oDoor,TRUE); // запереть дверь
    ActionPlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE);
    // рычаг переходит в другое положение
    }
else if(!GetIsOpen(oDoor)) //иначе, если дверь не открыта
    {
    SetLocked(oDoor,FALSE);// отпереть дверь
    AssignCommand(OBJECT_SELF,ActionOpenDoor(oDoor));
    // открыть дверь.
    ActionPlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
    // перевод рычага в другое положение
    }
}


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

Автор:::::::::::::::::DBColl::::::::::::::::::::::::::::::
May 8 2003
данный скрипт каждые 18 секунд убавляет хиты, если игрок более, чем на 15 футов от костра.
(эмуляция действия холода)
Neverwinter Script Source
void main()
{
object oPC = GetFirstPC();
object oFlame = GetObjectByTag("тэг пламени");
int nSpeedOfDec = 3
// 3 раунда (за 18 секунд здоровье уменьшиться на 1 единицу)
int nSpeed = GetLocalInt(oPC, "DecHealthSpeed");
// первый раз даже если такая переменная не заведена, значение будет == 0
if (nSpeed == nSpeedOfDec && GetDistanceBetween(oPC, oFlame) > 15.0)
  // проверяем сколько раундов прошло с последнего уменьшения Health
  // и расстояние до костра (15 метров)
  {
  effect eDamage = EffectDamage( 1, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL);
  /// определяется кол-во повреждений и тип
  ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC);
  /// нанесение урона
  AssignCommand(oPC, ActionSpeakString("Блин, холодно однако..."));
  SetLocalInt(oPC, "DecHealthSpeed", 0);
  return;
  }
else if (GetDistanceBetween(oPC, oFlame) < 15.0
        && GetCurrentHitPoints(oPC) <= GetMaxHitPoints(oPC))
  /// если дистанция 15 метров или меньше, то лечить 2 хитпоинта за раунд
  {
  effect eHeal = EffectHeal(2);
  ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oPC);
  return;
  }
SetLocalInt(oPC, "DecHealthSpeed", nSpeed+1);
}


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

Автор:::::::::::::::::DBColl::::::::::::::::::::::::::::::
May 28 2003
Это скрипт командира охраны. Ему все солдаты (его фракции) отдают честь. ставится в UserDefined
Neverwinter Script Source
#include nw_i0_generic
void main()
{
int nEvent = GetUserDefinedEventNumber();
if (nEvent == 1002)
   {
   object oNPC = GetLastPerceived();
   if (GetFactionEqual(oNPC, OBJECT_SELF))
      {
      if (GetLastPerceptionSeen() && GetDistanceToObject(oNPC) < 6.0f &&
      GetLocalInt(oNPC, "GREATED") != 1)
          {
          SetLocalInt(oNPC, "GREATED", 1);
          AssignCommand(oNPC, ClearAllActions());
          AssignCommand(oNPC, ActionDoCommand(SetFacingPoint(GetPosition(OBJECT_SELF))));
          AssignCommand(oNPC, ActionSpeakString("ЗдравиЯ желаю!"));
          AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_FIREFORGET_SALUTE, 0.5f, 1.0f));
          AssignCommand(oNPC, ActionDoCommand(WalkWayPoints()));
          DelayCommand(15.0f, SetLocalInt(oNPC, "GREATED", 0));
          }
      }
   return;
   }
}


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

Автор:::::::::::::::::DBColl::::::::::::::::::::::::::::::
Feb 20 2004
Я вот смотрю-смотрю, жду, но что-то так никто и не догадался, как просто можно сделать всплывающую строку на триггере... Вот мой вариант:
1. Создать триггер в палитре. В ОнЭнтер нужен всего один универсальный скрипт! Этот юзаем мы в Проклятии.
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Name
//:: Copyright © 2003 WRG!
//:://////////////////////////////////////////////
//:: Created By: DBColl
//:: Created On: 7.09.2003
//:://////////////////////////////////////////////
void main()
{
   object oPC = GetEnteringObject();
   if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "triggered") > 0)
       return;
   string sStr = GetName(OBJECT_SELF);
   AssignCommand(oPC, SpeakString(sStr));
   if (GetLockKeyTag(OBJECT_SELF) == "")
       SetLocalInt(OBJECT_SELF, "triggered", 1);
}

2. Создаем этот триггер в модуле, заходим в его свойства и в поле Name пишем текст, который должен всплыть над игроком при наступании на него!!!
3. В KeyTag вносим что-то (любое число!) и получаем постоянно всплывающий текст над всеми PC, кто войдет на него.

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

КОНЕЦ ЦИКЛА "СКРИПТЫ ДЯДЮШКИ DBCOLL'A" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"

Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 15:03
Сообщение #55


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ ДЯДЮШКИ LAZY RAMN'Ы"

автор::::::::::::Lazy Ramna::::::::::::::::::::
Oct 14 2003
LEX: ИСТОРИЧЕСКИЙ СКРИПТ LAZY. ОКТЯБРЬ 2003 ГОДА!! ВЕСЬ РУНЕТ ПОЛЬЗОВАЛСЯ ЭТОЙ ИДЕЕЙ ДО ВЫХОДА ПАТЧА DUMBO
Скрипт, позволяющий использовать букву "я" в скриптах
В константных строках буковка "я" запрещена, однако в переменных ее никто не запрещал. Посему создаем любой плэсейбл с тэгом ax_letter_ya и именем "я". Потом просто через ya() получаем нашу буковку, либо заменяем в строке все "йа" на "я". =)
Neverwinter Script Source
string ya(string sMessage = "йа")
   {
    string sYa = GetName(GetObjectByTag("ax_letter_ya"));
    string sResult = "";
    string sSub;
    int i = 0;
    while ((sSub = GetSubString(sMessage, i, 2)) != "")
           {
           if (sSub == "йа")
              {
              sResult += sYa;
              i += 2;
              }
           else
              {
              sResult += GetStringLeft(sSub, 1);
              i++;
              }
           }
    return sResult;
  }


Использование:
1) string sMessage = "Мо"+ya()+" сто"+ya()+"ть как стена";
2) string sMessage = ya("Мойа стойать как стена");
В обоих случаях в sMessage будет "Моя стоять как стена"

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

автор::::::::::::Lazy Ramna::::::::::::::::::::
Mar 15 2004
Не знаю, было или нет (я сюда не сильно заглядываю ), вот элементарнейший скрипт "автоперехода". Телепортирует наступившую на триггер кричу к объекту, тэг которого прописан в KeyTag. Вешается на OnEnter.
Neverwinter Script Source
void main()
{
object oPC = GetEnteringObject();
object oTarget = GetObjectByTag(GetTrapKeyTag(OBJECT_SELF));
if (GetIsObjectValid(oPC) && GetIsObjectValid(oTarget)) {
     AssignCommand(oPC, ClearAllActions());
     AssignCommand(oPC, JumpToObject(oTarget));
}
}

Я его ставлю после городских ворот, или ворот на мосту. Если PC не захочет "входить" в ворота, а решит пройтись чуть дальше к краю локации, то его насильно кинут куда надо.
Добавлено 18:57
Простенький инклюд. Позволяет получать кол-во лет/месяцев/дней/часов/минут/секунд, которое прошло с момента старта модуля. (в стиле UNIX_TIMESTAMP ) AX_LIB_START_YEAR - стартовый год.
Neverwinter Script Source
//© 2003 by Alexander Ponyatikh, aka Lazy Ranma

const int AX_LIB_START_YEAR = 0;

int GetCurrentYear()
{
   return GetCalendarYear() - AX_LIB_START_YEAR;
}

int GetCurrentMonth()
{
   return GetCurrentYear()*12 + GetCalendarMonth();
}

int GetCurrentDay()
{
   return (GetCurrentMonth() - 1)*28 + GetCalendarDay();
}

int GetCurrentHour()
{
   return (GetCurrentDay() - 1)*24 + GetTimeHour();
}

int GetCurrentMinute()
{
   return GetCurrentHour()*FloatToInt(HoursToSeconds(1))/60 + GetTimeMinute();
}

int GetCurrentSecond()
{
   return GetCurrentMinute()*60 + GetTimeSecond();
}


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

КОНЕЦ ЦИКЛА "СКРИПТЫ ДЯДЮШКИ LAZY RAMN'Ы" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 16:06
Сообщение #56


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ ДЯДЮШКИ BAAL'A"

автор::::::::::::Baal::::::::::::::::::::
May 7 2003
данный скрипт забирает у игрока (или любого другого объекта) все вещи и дестроит их.
Neverwinter Script Source
void main()
{
  object oPC = GetFirstPC();
  /// выбирает игрока ( если хотите другой объект то GetObjectByTag("тэг объекта")
  object oInv = GetFirstItemInInventory(oPC);
    /// брать первый предмет из инвентаря игрока
  while(GetIsObjectValid(oInv)) /// пока в инвентаре есть предмет
      {
      DestroyObject(oInv); /// удаляет его
      oInv = GetNextItemInInventory(oPC);
      /// брать следующий предмет из инвентаря игрока
      }
    int i=0;
    while(i<14
      {
      DestroyObject(GetItemInSlot(i, oPC)); /// удаление вещей из слотов
      i++;
      }
}


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

автор::::::::::::Baal::::::::::::::::::::
Aug 18 2003
Вот конечный, работающий скрипт часов, для тех кому интересно. Спасибо ДБу за то, что помог с минутами.
Neverwinter Script Source
void main()
{
int iHour=GetTimeHour();
int iGameHourRealMinutes = 2; // число реальных минут равное 1 игровому часу (в настройках модулЯ)
float fMinute = IntToFloat(GetTimeMinute());
float fSecond = IntToFloat(GetTimeSecond());
float fGameMinute = fMinute*(60/iGameHourRealMinutes)+(fSecond/iGameHourRealMinutes);
int iMinute=FloatToInt(fGameMinute);
string sHour;
string sMinute;
if(iHour>0||iHour==21)
sHour=" Час ";
if(iHour>1||iHour>21)
sHour=" Часа ";
if(iHour>4&&iHour<21)
sHour=" часов ";
if(iHour==0)
sHour=" часов ";
sHour=IntToString(iHour)+sHour;

int iVR=StringToInt(GetStringRight(IntToString(iMinute),1));
if(iVR==0)
sMinute=IntToString(iMinute)+" минут.";
if(iVR>0)
sMinute=IntToString(iMinute)+" минута.";
if(iVR>1)
sMinute=IntToString(iMinute)+" минуты.";
if(iVR>4||(iMinute>10&&iMinute<21))
sMinute=IntToString(iMinute)+" минут.";
if(iMinute<10)
sMinute="0"+sMinute;

AssignCommand(GetFirstPC(),SpeakString("Московское времЯ: "+sHour+sMinute));
PlaySound("as_an_rooster1");//звук можно убрать :-)
}


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

автор::::::::::::Baal::::::::::::::::::::
Этот скрипт подсчитовает сколько у цели предметов с выбранным тегом. oInventory - чей инвентарь. sItemTag - Тег
Neverwinter Script Source
int ItemsAmount(string sItemTag, object oCreature = OBJECT_SELF)
{
int N=0;
object oItem = GetFirstItemInInventory(oCreature);
while (GetIsObjectValid(oItem))
  {
  if(GetTag(oItem) == sItemTag)
      {
      N = N + GetNumStackedItems(oItem);
      }
  oItem = GetNextItemInInventory(oCreature);
  }
return N;
}


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

КОНЕЦ ЦИКЛА "СКРИПТЫ ДЯДЮШКИ BAAL'A" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 16:21
Сообщение #57


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ SMITH'A"

автор::::::::::::Smith::::::::::::::::::::
Sep 24 2003
Мне иногда приходилось сталкиваться с задачей создания случайной локации на заданном растоянии от какого-то объекта. Среди стандартных функций тулсета я такой вещи не нашел (хотя может быть плохо искал ), так, что пришлось написать самому. Может кому и пригодиться:
Neverwinter Script Source
location RandomLocation(object oTarget, float fRadius, int iLine = TRUE)
{
if(!iLine)
fRadius=IntToFloat(Random(FloatToInt(fRadius)));

float iXO=VectorMagnitude(GetPosition(oTarget))*cos(VectorToAngle(GetPosition(oTarget)
));
float iYO=VectorMagnitude(GetPosition(oTarget))*sin(VectorToAngle(GetPosition(oTarget)
));
float fRndomAngle=IntToFloat(Random(360));
location lNewLoc=Location(GetArea(oTarget),Vector(iXO+fRadius*cos(fRndomAngle),iYO+fRadiu
s*sin(fRndomAngle)),360.0);
return lNewLoc;
}

Скрипт создает случайную локацию на растоянии fRadius метров от объекта oTarget, причем, если задать iLine = FALSE, то локация может быть создана внутри круга на произвольном растоянии от объекта, не превышающем, однако, fRadius.

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

КОНЕЦ ЦИКЛА "СКРИПТЫ SMITH'A" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 16:22
Сообщение #58


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ SELLARY"

автор::::::::::::sellary::::::::::::::::::::
Oct 20 2003
Функция определяет, можно ли надеть указанный армор.
в функцию передаем:
oArmor - объект армора,
oCreature - объект создания, на которое этот армор пытаемся одеть
возвращает TRUE, если одеть можно, FALSE - в обратном случае.
Проверка идет без учета класса создания (возможно, в дальнейшем модифицирую "по просьбам радиослушателей").
Отдельное спасибо Lazy Ranma за идею и spurlos - за мотивацию, DBColl за подсказку с уровнем.
Neverwinter Script Source
int GetIsValidArmor(object oArmor, object oCreature)
{
       // считаем базовую цену армора
       int nPrice = GetGoldPieceValue(oArmor);

       // определяем уровень создания
       int nClass = GetHitDice(oCreature);

       // определяем, может ли создание класса nClass
       // одевать броню стоимостью nPrice
       // (используется таблица #13 из приложения;
       // считаем, что создание более, чем 20 уровня
       // может одеть любой армор)
       int bResult = TRUE;
       switch (nClass) {
               case 1: bResult = (nPrice<=1000);
                       break;
               case 2: bResult = (nPrice<=1500);
                       break;
               case 3: bResult = (nPrice<=2500);
                       break;
               case 4: bResult = (nPrice<=3500);
                       break;
               case 5: bResult = (nPrice<=5000);
                       break;
               case 6: bResult = (nPrice<=6500);
                       break;
               case 7: bResult = (nPrice<=9000);
                       break;
               case 8: bResult = (nPrice<=12000);
                       break;
               case 9: bResult = (nPrice<=15000);
                       break;
               case 10: bResult = (nPrice<=19500);
                       break;
               case 11: bResult = (nPrice<=25000);
                       break;
               case 12: bResult = (nPrice<=30000);
                       break;
               case 13: bResult = (nPrice<=35000);
                       break;
               case 14: bResult = (nPrice<=40000);
                       break;
               case 15: bResult = (nPrice<=50000);
                       break;
               case 16: bResult = (nPrice<=65000);
                       break;
               case 17: bResult = (nPrice<=75000);
                       break;
               case 18: bResult = (nPrice<=90000);
                       break;
               case 19: bResult = (nPrice<=110000);
                       break;
               case 20: bResult = (nPrice<=130000);
                       break;
               default: bResult = (nClass>20);
                       break;
       };

       // возвращаем результат
       return bResult;
}


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

КОНЕЦ ЦИКЛА "СКРИПТЫ SELLARY" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 16:23
Сообщение #59


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ GREEDO BEEFY"

автор::::::::::::Greedo Beefy::::::::::::::::::::
Jan 10 2004
Может кому то пригодится...
Если хотите что бы на вашем сервере, имеются ввиду шарды с PW, время и дата не сбрасывались с рестартом то можно сделать следующее.
Такой вот скриптик вешаем на любой предмет в модуле, лучше в защищенной локе, в слот OnHeartBeat
Neverwinter Script Source
void SaveCurTime (int minutes)
{
  int current = GetLocalInt(GetModule(), "cyclestill");
  if (current < ((minutes * 60) / 6))
  SetLocalInt(GetModule(), "cyclestill", current + 1);
  else
  {
        object oMod = GetModule();
        int iMonth = GetCalendarMonth();
        int iDay = GetCalendarDay();
        int iYear = GetCalendarYear();
        int iHour = GetTimeHour();
        SetCampaignInt("server_time", "CUR_YEAR", iYear, oMod);
        SetCampaignInt("server_time", "CUR_DAY", iDay, oMod);
        SetCampaignInt("server_time", "CUR_MONTH", iMonth, oMod);
        SetCampaignInt("server_time", "CUR_HOUR", iHour, oMod);
        SetLocalInt(GetModule(), "cyclestill", 0);
        WriteTimestampedLogEntry("Save Current Time completed");
  }
return;
}
void main ()
{
SaveCurTime(10);
}

Раз в десять минут (можно поставить любое значение) будет сохранятся текущая дата и время на сервере , игровое конечно же.
А на OnModuleLoad ставим это:
Neverwinter Script Source
void main()
{
object oMod = GetModule();
int iMonthNew = GetCampaignInt("server_time", "CUR_MONTH", oMod);
int iDayNew = GetCampaignInt("server_time", "CUR_DAY", oMod);
int iYearNew = GetCampaignInt("server_time", "CUR_YEAR", oMod);
int iHourNew = GetCampaignInt("server_time", "CUR_HOUR", oMod);
SetCalendar (iYearNew, iMonthNew, iDayNew);
SetTime (iHourNew, 0, 0, 0);
}

Написать скрипт вынудило желание ввести в банковскую систему проценты по вкладам и кредиты с процентами, которые зависят от времени. Ну как в жизни
С уважением Александр Дишке

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

КОНЕЦ ЦИКЛА "СКРИПТЫ GREEDO BEEFY" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 16:24
Сообщение #60


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ DOCFEERT'A"

автор::::::::::::DocFeert::::::::::::::::::::
Feb 10 2004
Вот скрипт для уборщика:
Cтавится на OnHeartBeat уборщика
Как только уборщик увидит валяющийся на земле предмет, он его сразу поднимет.
Neverwinter Script Source
void main()
{
object oItem = GetFirstObjectInArea(GetArea(OBJECT_SELF));
while (GetIsObjectValid(oItem) == TRUE)
ClearAllActions();
{
if (GetObjectType(oItem) == OBJECT_TYPE_ITEM)
{
ActionPickUpItem(oItem);
}
oItem = GetNextObjectInArea(GetArea(OBJECT_SELF));
}
}


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

автор::::::::::::DocFeert::::::::::::::::::::
Feb 24 2004
Скрипт определяет кол-во жизней цели в процентах. oObject - чьи жизни, Возвращает кол-во жизней oObject.
Neverwinter Script Source
int Percent(object oObject)
{
int iCur = GetCurrentHitPoints(oObject);
int iMax = GetMaxHitPoints(oObject);
int iSt = iCur * 100;
int iPercent = iSt / iMax;
return iPercent;
}


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

автор::::::::::::DocFeert::::::::::::::::::::
Feb 24 2004
Скрипт на автооткрывание дверей. Делаем триггер и вешаем на него 2 скрипта. Это на OnEnter Триггера:
Neverwinter Script Source
void main()
{
object oDoor = GetFirstObjectInShape(SHAPE_SPHERE, 3.0, GetLocation(OBJECT_SELF), FALSE, OBJECT_TYPE_DOOR);
if (GetLocked(OBJECT_SELF) == FALSE)
{
ActionOpenDoor(oDoor);
}
}

А это на OnExit Триггера:
Neverwinter Script Source
void main()
{
if (GetLocked(OBJECT_SELF) == FALSE)
{
object oDoor = GetFirstObjectInShape(SHAPE_SPHERE, 3.0, GetLocation(OBJECT_SELF), FALSE, OBJECT_TYPE_DOOR);
ActionCloseDoor(oDoor);
}
}

Триггер просто растягивается под открываемой дверью.

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

автор::::::::::::DocFeert::::::::::::::::::::
Mar 10 2004
А этот код позволяет создать "случайную локацию", как например в БГ или Фаллоут, когда идешь, идешь... И натыкаешься на каких-нибудь рейдеров. Для этого в oArea записываем локацию, в которой будут создоваться обьекты, в Х записываем количество тайлов этой локации по оси Х, в Y записываем количество тайлов этой локации по оси Y, в sObjByResRef пишем тег по ресрефу обьекта, в iObjType пишем тип обьекта (OBJECT_TYPE_*) а в iMaxObjects пишем максимальное количество этих обьектов.
Neverwinter Script Source
void RandomObjectsAtRandomLocation(object oArea, int X, int Y, string sObjByResRef, int iObjType, int iMaxObjects)
{
int iMax = 0;
float fX = IntToFloat(Random(X * 10));
float fY = IntToFloat(Random(Y * 10));
float fZ = 0.0;
float fF = IntToFloat(Random(360));
location lLoc = Location(oArea, Vector(fX, fY, fZ), fF);
while (iMax != iMaxObjects)
{
iMax = iMax + 1;
float fX = IntToFloat(Random(X * 10));
float fY = IntToFloat(Random(Y * 10));
float fZ = 0.0;
float fF = IntToFloat(Random(360));
location lLoc = Location(oArea, Vector(fX, fY, fZ), fF);
if (d2(1) == 2)
{
CreateObject(iObjType, sObjByResRef, lLoc, FALSE);
}
}
}


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

автор::::::::::::DocFeert::::::::::::::::::::
Mar 10 2004
А этот скрипт для переноса всех обьектов (крич, плейсов, итемов) из одной локации в другую. В oAreaFrom записываем локацию ИЗ которой переносим обьекты, в oAreaTo пишим ту локацию В которую переносим обьекты, если iDestroy = TRUE, все обьекты в локации oAreaFrom уничтожаются. Если в локации игрок, то он тоже переностится.
Neverwinter Script Source
void MoveArea(object oAreaFrom, object oAreaTo, int iDestroy=TRUE)
{
object oObject = GetFirstObjectInArea(oAreaFrom);
while (GetIsObjectValid(oObject) == TRUE)
{
location lLoc = Location(oAreaTo, GetPosition(oObject), GetFacing(oObject));
if (GetObjectType(oObject) == OBJECT_TYPE_ITEM)
{
CopyObject(oObject, lLoc, OBJECT_INVALID, GetTag(oObject));
if (iDestroy == TRUE)
{
DestroyObject(oObject);
}
}
if ((GetObjectType(oObject) == OBJECT_TYPE_PLACEABLE))
{
string sTag = GetResRef(oObject);
CreateObject(OBJECT_TYPE_PLACEABLE, sTag, lLoc);
if (iDestroy == TRUE)
{
DestroyObject(oObject);
}
}
if (GetObjectType(oObject) == OBJECT_TYPE_CREATURE)
{
AssignCommand(oObject, JumpToLocation(lLoc));
}
oObject = GetNextObjectInArea(oAreaFrom);
}
}


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

КОНЕЦ ЦИКЛА "СКРИПТЫ DOCFEERT'A" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 16:26
Сообщение #61


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ MALKOR'A"

автор::::::::::::MalkoR::::::::::::::::::::
Sep 13 2003
Идея скрипта такая. Стоит обелиск, вокруг стоят 4 шарика силы. В обелиске по порядку стоят 10 невидимых объекта, мелких. Шарики накладывают на onHeartbeat эффект луча в рэндом из этих 10 невидимых объекта. Получаеться эффект питания обелиска энергией этими шариками.
скрипт ставиться в onHeartbeat шариков
Neverwinter Script Source
void main()
{
object wp_k4 = GetObjectByTag("TWp_KEEPER4"); //WayPoint стояший на месте шарика, это на тот случай, если шарик атакуя кого то отойдет.
AssignCommand(OBJECT_SELF, ActionJumpToObject(wp_k4)); //перемешаеться на свое место
object os = OBJECT_SELF;
effect eff = EffectBeam(VFX_BEAM_LIGHTNING,os,BODY_NODE_CHEST,FALSE); //какой эффект накладывать на обелиск (тут была идея сделать ещё один скрипт, чтоб луч был рэндом, но с первого разане вышло, продолжать не стал из- за своей запарки  )

object c1 = GetObjectByTag("TP_CORPOSE_001"); //определяет невидимый объект в обелиске
object c2 = GetObjectByTag("TP_CORPOSE_002");
object c3 = GetObjectByTag("TP_CORPOSE_003");
object c4 = GetObjectByTag("TP_CORPOSE_004");
object c5 = GetObjectByTag("TP_CORPOSE_005");
object c6 = GetObjectByTag("TP_CORPOSE_006");
object c7 = GetObjectByTag("TP_CORPOSE_007");
object c8 = GetObjectByTag("TP_CORPOSE_008");
object c9 = GetObjectByTag("TP_CORPOSE_009");
object c10 = GetObjectByTag("TP_CORPOSE_010");

int a = d10();

if (a == 1)
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eff,c1,6.0f);
return;
}
if (a == 2)
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eff,c2,6.0f);
return;
}
if (a == 3)
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eff,c3,6.0f);
return;
}
///. . . . . . (а == 4, а ==5 и т.д. до 9) . . . . . . .

if (a == 10)
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eff,c10,6.0f);
return;
}
}


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

КОНЕЦ ЦИКЛА "СКРИПТЫ MALKOR'A" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 16:28
Сообщение #62


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ ДЯДЮШКИ VALLEO"

автор::::::::::::Valleo::::::::::::::::::::
Mar 19 2004
Маленький скриптик для реализации болота:
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();
}

Ставится на хербит любого объекта на локации болота (главное чтобы объект был плотовый )...

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

автор::::::::::::Valleo::::::::::::::::::::
Mar 19 2004
Мой личный код на проверку скилла Persuade. Используется харизма и ее модификатор, а так же кубики для болей реалестичности...
Использовать:
NPC: Привет!
1) И тебе привет! У тебя же есть работа?
NPC (1) [Проверка удачна] Да, конечно! <-- сюда вставить скрипт проверки Persuade
NPC (2) [Проверка неудачна] С чего ты взял?
2) Извини, обознался...
Neverwinter Script Source
int StartingConditional()
{
object oPC = GetPCSpeaker();
object oNPC = OBJECT_SELF;
object oWinner;
int iCharisma = GetAbilityScore(oPC,ABILITY_CHARISMA);
if(iCharisma < 7)
{
SendMessageToPC(oPC,"У вас харизма ниже 7, вы не можете нормально разговаривать с "+GetName(oNPC));
return FALSE;
}
int iPCPersuade, iNPCPersuade;
int iAddPC, iAddNPC;
int iPCCharModif, iNPCCharModif;
if(GetHasSkill(SKILL_PERSUADE,oPC)) iPCPersuade = GetSkillRank(SKILL_PERSUADE,oPC);
if(GetHasSkill(SKILL_PERSUADE,oNPC)) iNPCPersuade = GetSkillRank(SKILL_PERSUADE,oNPC);
iPCCharModif = GetAbilityModifier(ABILITY_CHARISMA,oPC);
iNPCCharModif = GetAbilityModifier(ABILITY_CHARISMA,oNPC);
iAddPC = d12();
iAddNPC = d12();
SendMessageToPC(oPC,"Проверка на скилл Persuade:");
SendMessageToPC(oPC,"Ваш сккилл равен = "+IntToString(iPCPersuade)+" + "+IntToString(iAddPC)+" (d12) + "+IntToString(iPCCharModif)+" (модификатор харизмы) = " +IntToString(iPCPersuade+iAddPC+iPCCharModif));
SendMessageToPC(oPC,"Скилл вашего оппонента равен = "+IntToString(iNPCPersuade)+" + "+IntToString(iAddNPC)+" (d12)  + "+IntToString(iNPCCharModif)+" (модификатор харизмы) = " +IntToString(iNPCPersuade+iAddNPC+iNPCCharModif));
iPCPersuade = iPCPersuade + iAddPC + iPCCharModif;
iNPCPersuade = iNPCPersuade + iAddNPC + iNPCCharModif;
if(iPCPersuade > iNPCPersuade)
{
SendMessageToPC(oPC,"Вы удачно провели проверку скилла.");
return TRUE;
}
SendMessageToPC(oPC,"Вы провалили проверку.");
return FALSE;
}


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

КОНЕЦ ЦИКЛА "СКРИПТЫ ДЯДЮШКИ VALLEO" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 16:30
Сообщение #63


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ ТЕМНОГО ЛОРДА"

автор::::::::::::Темный лорд::::::::::::::::::::
May 17 2003
Скрипт на то. Чтобы после смерти объекты воскрешали. Я делал его для себя. Подскажу как его еще можно использовать.
Я взял обычных людей. Поставив им тег h01. И вставил в onDeath этот скрипт. В результате получилось, что если убить этого человека.
Он превратится в зомби. Главное не забыть поставить на карте объект Nekrolog01.
Neverwinter Script Source
void Raise()
{
effect eVisDead = EffectVisualEffect(VFX_IMP_HEAD_ACID);///Эффект с которым объект будет воскресать. В данном случае это кислота!
object oNew = CreateObject(OBJECT_TYPE_CREATURE,"ZombieWeak07", GetLocation(OBJECT_SELF)) ;///Тег объекта который будет воскресать.
ApplyEffectAtLocation(DURATION_TYPE_PERMANENT, eVisDead, GetLocation(oNew));

}
void main()
{
object oCleric = GetNearestObjectByTag("Nekrolog01");/// Тег объекта который будет оживлять. И которого надо убить чтобы остальные больше не оживали.

if (GetIsObjectValid(oCleric) == TRUE && GetIsDead(oCleric) == FALSE)
{
AssignCommand(oCleric, ClearAllActions());
AssignCommand(oCleric, ActionPlayAnimation(ANIMATION_LOOPING_WORSHIP, 1.0, 3.0));///Действия которые выполняет "оживитель" как только умирает один из объектов. В данном случае становится на колени.
effect eVisCleric = EffectVisualEffect(VFX_IMP_AURA_NEGATIVE_ENERGY);/// Эффект с которым клирик воскрешает. В данном случае появляется красного цвета аура. Но эффекты можно менять!
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVisCleric, oCleric);
DelayCommand(3.0, Raise());
DelayCommand(0.2,AssignCommand(oCleric, SpeakOneLinerConversation())) ;
}
}

Самое необходимое я выделил.

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

автор::::::::::::Темный лорд::::::::::::::::::::
May 17 2003
Скрипт моего друга. Он если зайдет то даст его описание. Вообще скрипт на то чтобы после смерти находится в бессознательном состоянии 10 едениц. 1 вставляется в OnHeartbeat. Второй в OnPlayerDying. /// Без пояснений.
Neverwinter Script Source
void loadBehaviors()
{
SetLocalInt(OBJECT_SELF, "DEATH_TARGET", -10);
SetLocalInt(OBJECT_SELF, "PLAYER_ONLY_GRUNTS_WHILE_DYING", FALSE);
}
void bleedCheck(object pc)
{
if (!GetIsPC(pc))
return;
int DEATH_TARGET = GetLocalInt(OBJECT_SELF, "DEATH_TARGET");
int PLAYER_ONLY_GRUNTS_WHILE_DYING = GetLocalInt(OBJECT_SELF, "PLAYER_ONLY_GRUNTS_WHILE_DYING");
int hp = GetCurrentHitPoints(pc);
if ((hp <= 0) && (hp > DEATH_TARGET))
    {
    effect dmg = EffectDamage(1);
    ApplyEffectToObject(DURATION_TYPE_INSTANT, dmg, pc);
    int which = Random(6)+1;
    if (PLAYER_ONLY_GRUNTS_WHILE_DYING)
    switch (which)
        {
        case 1:
              PlayVoiceChat(VOICE_CHAT_PAIN1, pc);
              break;
        case 2:
              PlayVoiceChat(VOICE_CHAT_PAIN2, pc);
              break;
        case 3:
              PlayVoiceChat(VOICE_CHAT_PAIN3, pc);
              break;
        case 4:
              PlayVoiceChat(VOICE_CHAT_HEALME, pc);
              break;
        case 5:
              PlayVoiceChat(VOICE_CHAT_NEARDEATH, pc);
              break;
        case 6:
              PlayVoiceChat(VOICE_CHAT_HELP, pc);
              break;
       }
    }
else if (hp <= DEATH_TARGET)
   {
   effect death = EffectDeath(FALSE, FALSE);
   ApplyEffectToObject(DURATION_TYPE_INSTANT, death, pc);
   }
}

void main()
{
loadBehaviors();
object pc = GetFirstPC();
while (GetIsObjectValid(pc))
   {
   bleedCheck(pc);
   pc = GetNextPC();
   }
}



Neverwinter Script Source
void main()
{
// load up desired behaviors for all OnHeartbeat scripts
loadBehaviors();

// enumerate all PCs, calling bleedCheck on each
// if you want to add more / other scripts that act on all players
// every heartbeat, this is the place to do it ... just put a call
// to them after (or before) bleedCheck, within the while loop.
object pc = GetFirstPC();

while (GetIsObjectValid(pc))
  {
  bleedCheck(pc);
  pc = GetNextPC();
  }
}


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

автор::::::::::::Темный лорд::::::::::::::::::::
Jun 3 2003
Вот еще скрипт из моего модуля. Ставится как правило. На OnUsed
предмета. Что телепортирует игрока на заданный вэйпоинт.
Neverwinter Script Source
void main()
{
object oPC = GetLastUsedBy();
object oTarget = GetObjectByTag("Waypoint"); /// тэг Waypoint-та, на который попадёт игрок.
effect eVis = EffectVisualEffect(VFX_IMP_HEALING_X); /// эффект с которым игрок будет попадать.
location lPC = GetLocation(oPC);
ApplyEffectAtLocation(DURATION_TYPE_PERMANENT, eVis, lPC);
AssignCommand(oPC,JumpToObject(oTarget));
}


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

автор::::::::::::Темный лорд::::::::::::::::::::
Jun 3 2003
На превращение НПC в предмет. Вставляется в Heartbeat!!
(Скрипт взят из гаргульи.)
Neverwinter Script Source
void main()
  {
  object oPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
  if ((GetIsObjectValid(oPC) != TRUE) || (GetIsDead(oPC) == TRUE) || GetDistanceToObject(oPC) >= 10.0)
    {
    location l = GetLocation(OBJECT_SELF);
    location lNew = Location( GetAreaFromLocation(l), GetPositionFromLocation(l), GetFacingFromLocation(l) + 180);
    // CreateObject( OBJECT_TYPE_PLACEABLE, "plc_statue3", lNew );
    CreateObject(OBJECT_TYPE_PLACEABLE, "StatueStone", lNew); /// предмет в который НПК будет превращатся.
    DestroyObject(OBJECT_SELF, 0.5);
    }
  }


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

КОНЕЦ ЦИКЛА "СКРИПТЫ ТЕМНОГО ЛОРДА" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 16:31
Сообщение #64


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ NEUROSHOOTA"

автор::::::::::::neuroshoot::::::::::::::::::::
Jun 19 2003
Скрипт смены погоды (таких наверное дофига уже сделали, но ине лень было искать, вот и написал).
Скрипт кладете на хертбит зоны:
Neverwinter Script Source
void main()
{
object oArea = OBJECT_SELF;
int nRain = WEATHER_RAIN;
int nClear = WEATHER_CLEAR;
int nDef = WEATHER_USE_AREA_SETTINGS;
int nHour = GetTimeHour();
if(nHour == 20|| nHour == 21|| nHour == 22|| nHour == 23||
nHour == 24|| nHour == 0 || nHour == 1 || nHour == 2 ||
nHour == 3 || nHour == 4 || nHour == 5 || nHour == 6 &&
!GetLocalInt(oArea, "IsDef") == 1)
{
SetWeather(oArea, nDef);
SetLocalInt(oArea, "IsRaining", 0);
SetLocalInt(oArea, "IsClear", 0);
SetLocalInt(oArea, "IsDef", 1);
}

if(nHour == 7 || nHour == 8 || nHour == 9 || nHour == 10||
nHour == 11|| nHour == 12&&
!GetLocalInt(oArea, "IsClear") == 1)
{
SetWeather(oArea, nClear);
SetLocalInt(oArea, "IsRaining", 0);
SetLocalInt(oArea, "IsClear", 1);
SetLocalInt(oArea, "IsDef", 0);
}

if(nHour == 13|| nHour == 14|| nHour == 15|| nHour == 16||
nHour == 17|| nHour == 18|| nHour == 19&&
!GetLocalInt(oArea, "IsRaining") == 1)
{
SetWeather(oArea, nRain);
SetLocalInt(oArea, "IsRaining", 1);
SetLocalInt(oArea, "IsClear", 0);
SetLocalInt(oArea, "IsDef", 0);
}
}

Вроде все работает. Если хотите, чтобы погода менялась чаще, поменяйте измените время срабатывания. Для полноты картины разместите на карте различные звуки, которые будут появляться в определенное время (например звук грозы и т.д.).

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

КОНЕЦ ЦИКЛА "СКРИПТЫ ТЕМНОГО ЛОРДА" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 16:33
Сообщение #65


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ ДЯДЮШКИ AIWAN'A"

автор::::::::::::Aiwan::::::::::::::::::::
Jan 19 2004
Скрипт лута для класса в после выполнения квеста.
Neverwinter Script Source
//::///////////////////////////////////////////////////////////
//:: Created By: WRG! Aiwan aiwanwrg.ru
//:: Created On: 19.01.2004
//:://////////////////////////////////////////////////////////
/*
Скрипт на OnOpen сундука. Здесь приведены только
два класса, но проверить можно любой, достаточно
скопировать строки кода и кликнув на классе в скрипте
F-2, выбрать нужный класс. Если класс не попал в
проверку, то получаем самую нижнюю вещь.
*/

//:://////////////////////////////////////////////////////////
void main()
{
  object oPC = GetLastOpenedBy();

  if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "DO_IT") ||
       !GetLocalInt(oPC, "ПЕРЕМЕННАЯ_КВЕСТА"))
      {return;}
     SetLocalInt(OBJECT_SELF, "DO_IT", TRUE);

     if(GetLevelByClass(CLASS_TYPE_CLERIC, oPC) >= 1) // КЛЕРИК выше 1 уров.
       {
       CreateItemOnObject("res-ref предмета", OBJECT_SELF, 1);
         return;
       }
     if(GetLevelByClass(CLASS_TYPE_WIZARD,oPC) >= 1) // МАГ выше 1 уров. итд
       {
       CreateItemOnObject("res-ref предмета ", OBJECT_SELF, 1);
         return;
       }
       CreateItemOnObject("res-ref предмета ", OBJECT_SELF, 1); // все остальные
         return;
}


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

автор::::::::::::Aiwan::::::::::::::::::::
Mar 5 2004
Вот простенький скрипт, ставится на OnOpen сундука, саркофаги и т.д. При проверке скилла поиск, создает в инвентаре объект в зависимости от алигмента. Код не идеален, но работает
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Created By: WRG! Aiwan aiwane-mail.ru
//:: Created On: 06.12.2003
//:://////////////////////////////////////////////
/*  Скрипт на OnOpen сундука или саркофага.
     у каждого, алигмента свой приз.
    Если поиск прошел, получаем плюшку.
*/

//:://////////////////////////////////////////////
#include "nw_i0_tool"
void main()
{
  object oPC = GetLastOpenedBy();

  if (GetIsPC(oPC) && GetLocalInt(OBJECT_SELF, "DO_IT") != 1 &&
     (AutoDC(DC_HARD, SKILL_SEARCH, oPC))) // ПРОВЕРКА СКИЛЛА ПОИСК
    {
    AssignCommand(oPC, SpeakString("Bам удалось обнаружить предмет."));
    if (GetAlignmentGoodEvil(oPC) == ALIGNMENT_GOOD) // ПЛЮШКА ДЛЯ ГУДА
       {
       CreateItemOnObject("ResRef ОБЪЕКТА", OBJECT_SELF, 1);
       }
       if (GetAlignmentGoodEvil(oPC) == ALIGNMENT_EVIL) // ПЛЮШКА ДЛЯ ЕВИЛА
           {
           CreateItemOnObject("ResRef ОБЪЕКТА", OBJECT_SELF, 1);
           }
    RewardPartyXP(1500, oPC);
    SetLocalInt(OBJECT_SELF, "DO_IT", 1);
    }
  if (GetIsPC(oPC) && GetLocalInt(OBJECT_SELF, "DO_IT") != 1)
  {
  AssignCommand(oPC, SpeakString("Вам не удалось обнаружить ничего."));
  RewardPartyXP(500, oPC);
  SetLocalInt(OBJECT_SELF, "DO_IT", 1);
  }
}


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

автор::::::::::::Aiwan::::::::::::::::::::
Mar 5 2004
Вот еще один скрипт. Короче, создаете в палитре НПС и делаете его с нужными свойствами, что бы он рандомно бродил или еще что. Дальше, в локации где он должен спавниться, на любой объект вешаете скрипт на хербит. И усе, ночью будет приведение, днем все спокойно

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!
//:://////////////////////////////////////////////
/*
СТАВИМ НЕВИДИМЫЙ ОБЪЕКТ В ЛОКЕ И НА OnHeartBeat
КИДАЕМ СКРИПТ. НОЧЬЮ ПОЯВЛЯЕТСЯ ДУХ ИЗ ПАЛИТРЫ
С НАСТУПЛЕНИЕМ УТРА ДЕСТРОИТЬСЯ. КТО ХОЧЕТ МОЖЕТ
      ДОБАВИТЬ ТОЧНОЕ ВРЕМЯ ДЛЯ СПАВНА
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 03.02.2004
//:://////////////////////////////////////////////

void main()
{
    object oItm = OBJECT_SELF;
    object oTarget = GetObjectByTag("WP_NIMPHA_GOST"); //ТОЧКА ПОЯВЛЕНИЯ ДУХА
    object oGost = GetObjectByTag("ANDR_GOST");
//=====================  ДЕНЬ  ====================
    if (GetIsDay() && GetLocalInt(OBJECT_SELF, "NIGHT") == 1)
    {
      ApplyEffectAtLocation(DURATION_TYPE_INSTANT,
      EffectVisualEffect(VFX_FNF_SOUND_BURST), GetLocation(oGost));
      ActionWait(1.0);
      ActionDoCommand(DestroyObject(oGost));
      SetLocalInt(OBJECT_SELF, "NIGHT", 0);
    }
    if (!GetIsNight() && GetLocalInt(OBJECT_SELF, "NIGHT") == 0)
    return;
//=====================  НОЧЬ =====================
    {
    if (!GetIsNight() || GetLocalInt(OBJECT_SELF, "NIGHT") == 1)
    return;

      oGost = CreateObject(OBJECT_TYPE_CREATURE, "ResRef_ДУХА", GetLocation(oTarget));
      ApplyEffectAtLocation(DURATION_TYPE_INSTANT,
      EffectVisualEffect(VFX_IMP_DEATH_WARD), GetLocation(oTarget));
      AssignCommand(oGost, ClearAllActions());
      SetLocalInt(OBJECT_SELF, "NIGHT", 1);
     }
}


Перед спавном вашего Духа поставьте строчку, я не проверял. но должно пахать:
Neverwinter Script Source
if (GetTimeHour()==23) // ТУТ УКАЖЕТЕ ВРЕМЯ


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

автор::::::::::::Aiwan::::::::::::::::::::
Mar 8 2004
У меня много дверей в модуле, которые произносят фразу, типа: "Запечатано магией. Открыть нельзя" Ну и в том же духе. Так вот, скриптов-стрингов развелось уже довольно много Сел я тут и написал парачку ну очень простеньких скриптиков для этих нужд. Если вам пригодятся, буду только рад.
Первый, просто скрипт. Если вам не в лом его править под каждую дверь, то ставьте его.
Второй проще для установки, но немного с побочным эффектом в виде вейпоинта. Какой нравится, тот и берите.
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!
//:: OnFailToOpen
//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 10.01.2004
//:://////////////////////////////////////////////
void main()
{
string oDoor = GetTag(OBJECT_SELF);
string sMesseg = "ОШИБКА! TAG двери НЕПРАВИЛЬНЫЙ!"; // ЕСЛИ ВЫ ОШИБЛИСЬ С ТЭГОМ
{
   if (oDoor == "TAG_ДВЕРИ_01" || oDoor == "TAG_ДВЕРИ_02") // ОДИНАКОВЫЕ ФРАЗЫ ДЛЯ РАЗНЫХ ДВЕРЕЙ
      {sMesseg = "Дверь заперта, ключ украден.";}
   if (oDoor == "TAG_ДВЕРИ_03")
      {sMesseg = "Дверь заперта.";}
SpeakString(sMesseg);
}
}


Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!
//:: OnFailToOpen
//:://////////////////////////////////////////////
/*
  WP_DOOR_TXT - вейп с именем нашего текста.
    Ставим его сразу перед нужной дверью.
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 10.01.2004
//:://////////////////////////////////////////////
void main()
{
object oWp = GetNearestObjectByTag("WP_DOOR_TXT"); // БЕРЕМ БЛИЖАЙШИЙ
string sDoor = GetName(oWp);

   if (GetIsObjectValid(oWp) && GetDistanceBetween(oWp, OBJECT_SELF) <= 10.0f)
       //  ЕСЛИ ЕСТЬ ТАКОЙ WP И ОН НЕ ДАЛЬШЕ 10 МЕТРОВ
       {
       SpeakString(sDoor); // ПРОИЗНОСИМ ЕГО ИМЯ
        return;
       }
       else
          {
          SpeakString("Ошибка! Не могу найти WP_DOOR_TXT!");// ЕСЛИ МЫ ЗАБЫЛИ ПОСТАВИТЬ
          return;
          }
}


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

автор::::::::::::Aiwan::::::::::::::::::::
Mar 14 2004
Воот ну очень простой скриптик. Рандомный лут в КВЕСТОВЫЙ сундук, плюшка к плотовому предмету или еще куда.
Мне необходимо дать игроку разные вещи но +4, +5 и т.д. Править лут общий из-за пары сундуков не охота
Чем проще тем надежнее Вспомнил как мне нужен был такой скрипт год назад
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Copyright © 2004 WRG!  www.wrg.ru
//:: OnOpen OBJECT
//:://////////////////////////////////////////////
/*
           РАНДОМНЫЙ ЛУТ ДЛЯ СУНДУКА
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan    Aiwane-mail.ru
//:: Created On: 14.03.2004
//:://////////////////////////////////////////////
void main()
{
  object oPC = GetLastOpenedBy();
  string sResRef;
if (!GetIsPC(oPC) || GetLocalInt(OBJECT_SELF, "DO_IT"))
      {return;}
{
  SetLocalInt(OBJECT_SELF, "DO_IT", TRUE);
  int iPrize = Random(10);
             switch (iPrize)
             {
                   case 0:
                   {
                        sResRef = "sResRef_itm"; break;
                   }
                   case 1:
                   {
                        sResRef = "sResRef_itm"; break;
                   }
                   case 2:
                   {
                        sResRef = "sResRef_itm"; break;
                   }
                   case 3:
                   {
                        sResRef = "sResRef_itm"; break;
                   }
                   case 4:
                   {
                        sResRef = "sResRef_itm"; break;
                   }
                   case 5:
                   {
                        sResRef = "sResRef_itm"; break;
                   }
                   case 6:
                   {
                        sResRef = "sResRef_itm"; break;
                   }
                   case 7:
                   {
                        sResRef = "sResRef_itm"; break;
                   }
                   case 8:
                   {
                        sResRef = "sResRef_itm"; break;
                   }
                   case 9:
                   {
                        sResRef = "sResRef_itm"; break;
                   }
             }
     CreateItemOnObject(sResRef, OBJECT_SELF, 1); // ЭТО РАНДОМНЫЙ ЛУТ
     CreateItemOnObject("sResRef_itm_2", OBJECT_SELF, 1); // ЭТО ПОСТОЯННЫЙ, т.е. В ЛЮБОМ СЛУЧАЕ ВЕЩЬ №2
   }
}


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

КОНЕЦ ЦИКЛА "СКРИПТЫ ДЯДЮШКИ AIWAN'A" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 16:34
Сообщение #66


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ EXICUTIONER'A"

автор::::::::::::NightElf-Sniper aka Executioner::::::::::::::::::::
Заняляс я тут немного скриптованием и вот что из этого получилось:
Neverwinter Script Source
//:: Dlg_Open_Store :: Executioner :://

void main()
{
string sNPSTag = GetTag(OBJECT_SELF);
object oStore = GetNearestObjectByTag(sNPSTag+"_store");

if(GetObjectType(oStore) == OBJECT_TYPE_STORE)
OpenStore(oStore, GetPCSpeaker());

else
ActionSpeakStringByStrRef(53090, TALKVOLUME_TALK);
}

Универсальный скрипт открытия магазинов, что бы все работало делаете так:
создаете непися с тегом m_weapons, после чего создаете рядом с ним магазин и даете ему тег m_weapons_store, после чего скрипт ставится на нужную ветвь диалога...
И вот это:
Neverwinter Script Source
/******************************
Name: _On_Pl_Death
Autor: Executioner
*******************************/


void main()
{
object oDied = GetLastPlayerDied();
object oHenchman = GetHenchman(oDied);
object oKiller = GetLastAttacker(oDied);
object oMod = GetModule();

string sName = GetName(oDied);
string sID = GetName(oDied)+GetPCPublicCDKey(oDied); //ID умершего, ибо скрипт писался для мультика...

int iGold = GetGold(oDied);

location lDiedHere = GetLocation(oDied);

object oDeathCorpse=CreateObject(OBJECT_TYPE_PLACEABLE,"mod_deathcorpse",lDiedHere,FALSE,"DeathCorpse"+sID);
object oBag = CreateItemOnObject("mod_bagofgold",oDeathCorpse);


//убираем хенчу
if (GetIsObjectValid(oHenchman))
RemoveHenchman(oDied, oHenchman);


//Воскрешаем
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oDied);
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oDied)), oDied);
AssignCommand(oDied, ActionJumpToObject(GetObjectByTag("wp_death"))); &#092;&#092; Туда, куда должен прыгать чар после смерти(храм&#092;фуга)


//Снимаем 10% экспы
int iDeadXP = 10;
int iXP = GetXP(oDied);
int iNewXP = iXP-iXP*iDeadXP/100;

SetXP(oDied, iNewXP);

//Отнимаем деньги и вещи и кидаем их в лут
SetLocalString(oDeathCorpse,"oDiedName",sName);
SetLocalInt(oBag,"Gold",iGold);

int i;
for(i=0;i<15;i++)
AssignCommand(oDeathCorpse, ActionTakeItem(GetItemInSlot(i, oDied), oDied));

AssignCommand(oDeathCorpse, TakeGoldFromCreature(iGold,oDied,TRUE));
}
[nss]

[nss]
//:: OnOpen_DthCorpse :: Executioner :://
void main()
{
SpeakString("Corpse of "+GetLocalString(OBJECT_SELF,"oDiedName"),TALKVOLUME_TALK);
}


Neverwinter Script Source
//:: OnClse_DthCorpse :: Executioner :://
void main()
{
if(GetIsObjectValid(GetFirstItemInInventory(OBJECT_SELF))==FALSE)
DelayCommand(3.0,DestroyObject(OBJECT_SELF));
}

Для полной работоспособности надо создать еще 1 плейсейбл и 1 итем и поставить вейпойн куда надо бросать после смерти(фуга\храм)

плейсейбл:
tag: Mod_DeathCorpse
resref: mod_deathcorpse
ставим галку напротив Usable и Has Inventory
так же на OnClose ставим скрипт OnClse_DthCorpse, а на OnOpen соответственно OnOpen_DthCorpse
итем:
tag: Mod_BagOfGold
resref: mod_bagofgold

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

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

КОНЕЦ ЦИКЛА "СКРИПТЫ EXICUTIONER'A" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 16:37
Сообщение #67


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ (MOF)DARTH_NICK'A"

автор::::::::::::[MoF]Darth_Nick::::::::::::::::::::
Jul 3 2004
получение лвла по алайменту
Neverwinter Script Source
/*
Created By: [MoF]Darth_Nick
Data Of Creating: 02.07.2004 11:03
Discription: So, this script is do following - when you have a level up, after up
script founding your alignment(GOOD, EVIL, NEUTRAL) and doing something visual effects
for you. Also effects maybe change if you change Constans...Sample:
VFX_FNF_SUMMON_EPIC_UNDEAD - this is first constant of evil leveling, delete that and
enter something yours in the list of constants, an example - VFX_FNF_IMPLOSION.
*/


void main()
{
object oPC = GetPCLevellingUp();

if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_EVIL)
{
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SUMMON_EPIC_UNDEAD), oPC));
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HARM), oPC));
}
else if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_GOOD)
{
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HOLY_AID), oPC));
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SUNBEAM), oPC));
}
else if(GetAlignmentGoodEvil(oPC) == ALIGNMENT_NEUTRAL)
{
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SOUND_BURST), oPC));
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HEALING_X), oPC));
}
}


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

автор::::::::::::[MoF]Darth_Nick::::::::::::::::::::
Jul 3 2004
веселая ловушка
Neverwinter Script Source
/*
Created By: [MoF]Darth_Nick
Data Of Creating: 11:37
Discription: Script is stand on a OnEnter of Generic Triger, you also can use it in the
trap, but unexpectandlly is be very other!
*/


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);
}
}


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

КОНЕЦ ЦИКЛА "СКРИПТЫ (MOF)DARTH_NICK'A" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 19 2005, 16:39
Сообщение #68


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

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



СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ"
ЦИКЛ "СКРИПТЫ RED DEVIL'A"

автор::::::::::::Red Devil::::::::::::::::::::
Jul 31 2004
Значит так крафтинг. Крафт осущетсвляется при разговоре с неписем.
Крафт брони +1 к АС.
Neverwinter Script Source
#include "x2_inc_itemprop"
void main()
{
int iBonus;
object oPC=GetPCSpeaker();
object oArmor=GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);
itemproperty ipHasAC=GetFirstItemProperty(oArmor);
GetItemPropertyType(ipHasAC)==ITEM_PROPERTY_AC_BONUS;
if (!GetIsObjectValid(oArmor)) return;
if (GetBaseItemType(oArmor)!=BASE_ITEM_ARMOR) return;
   {
   iBonus=GetItemPropertyCostTableValue(ipHasAC);
   if (iBonus<0) iBonus=0;
   iBonus++;
   itemproperty ipAddAC=ItemPropertyACBonus(iBonus);
   IPSafeAddItemProperty(oArmor,ipAddAC);
   }
}


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

автор::::::::::::Red Devil::::::::::::::::::::
Jul 31 2004
Крафт оружия +1энчант бонус, либо елси это лук или арбалет +1 атак бонус.
Neverwinter Script Source
#include "x2_inc_itemprop"
void main()
{
object oPC=GetPCSpeaker();
object oWeap=GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
int iBonus;
int bType=GetBaseItemType(oWeap);
if (!GetIsObjectValid(oWeap)) return;
if ((bType == BASE_ITEM_BASTARDSWORD) ||
(bType == BASE_ITEM_BATTLEAXE) ||
(bType == BASE_ITEM_CLUB) ||
(bType == BASE_ITEM_DAGGER) ||
(bType == BASE_ITEM_DIREMACE) ||
(bType == BASE_ITEM_DOUBLEAXE) ||
(bType == BASE_ITEM_DWARVENWARAXE) ||
(bType == BASE_ITEM_GREATAXE) ||
(bType == BASE_ITEM_GREATSWORD) ||
(bType == BASE_ITEM_HALBERD) ||
(bType == BASE_ITEM_HANDAXE) ||
(bType == BASE_ITEM_HEAVYFLAIL) ||
(bType == BASE_ITEM_KAMA) ||
(bType == BASE_ITEM_KATANA) ||
(bType == BASE_ITEM_KUKRI) ||
(bType == BASE_ITEM_LIGHTFLAIL) ||
(bType == BASE_ITEM_LIGHTHAMMER) ||
(bType == BASE_ITEM_LIGHTMACE) ||
(bType == BASE_ITEM_LONGSWORD) ||
(bType == BASE_ITEM_MORNINGSTAR) ||
(bType == BASE_ITEM_QUARTERSTAFF) ||
(bType == BASE_ITEM_RAPIER) ||
(bType == BASE_ITEM_SCIMITAR) ||
(bType == BASE_ITEM_SCYTHE) ||
(bType == BASE_ITEM_SHORTSPEAR) ||
(bType == BASE_ITEM_SHORTSWORD) ||
(bType == BASE_ITEM_SICKLE) ||
(bType == BASE_ITEM_TWOBLADEDSWORD) ||
(bType == BASE_ITEM_WARHAMMER) ||
(bType == BASE_ITEM_WHIP) ||
(bType == BASE_ITEM_SHURIKEN) ||
(bType == BASE_ITEM_WHIP))
{
iBonus=IPGetWeaponEnhancementBonus(oWeap);
iBonus++;
itemproperty ipAdd=ItemPropertyEnhancementBonus(iBonus);
IPSafeAddItemProperty(oWeap,ipAdd);
}
else
if ((bType == BASE_ITEM_SLING)||
(bType == BASE_ITEM_SHORTBOW)||
(bType == BASE_ITEM_LONGBOW)||
(bType == BASE_ITEM_LIGHTCROSSBOW)||
(bType == BASE_ITEM_HEAVYCROSSBOW))
{
itemproperty ipHasAttack=GetFirstItemProperty(oWeap);
GetItemPropertyType(ipHasAttack)==ITEM_PROPERTY_ATTACK_BONUS;
iBonus=GetItemPropertyCostTableValue(ipHasAttack);
if (iBonus<0) iBonus=0;
iBonus++;
itemproperty ipAddAttack=ItemPropertyAttackBonus(iBonus);
IPSafeAddItemProperty(oWeap,ipAddAttack);
}
}


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

КОНЕЦ ЦИКЛА "СКРИПТЫ RED DEVIL'A" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"


КОНЕЦ СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Mar 24 2005, 11:10
Сообщение #69


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

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



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

Скриптовая система из "Проклятия Левора", предназначенная для переноса вещей хенчмана в следующий модуль. Работает только с одним хенчманом! Скрипт bm_inv_transit1 запускаеться перед переходом в новый модуль. Скрипт bm_inv_transit3 запускаеться в новом модуле, уже после того как присоединен хенчман(хенч должен быть с пустыми слотами и инвентарем).

На закрытой локе должны находиться 2 монстра с пустым инвентарем и с тагами SECOND_PC и SECOND_HENCH
в палитре должны быть 3 сумки с одинаковым тагом и ресрефом transit_cont1, transit_cont2 и transit_cont3

Neverwinter Script Source
//::///////////////////////////////////////////////
//:: FileName  bm_inv_transit1
//:: © 2005 WRG!
//:://////////////////////////////////////////////
/*
   Первый скрипт копирует все вещи из инвентарЯ РС и
      хенча в ивентари монстров на закрытой локе,
        уничтожаЯ оригиналы. "плотовые" вещи
         обрабатываютьсЯ в первую очередь
*/

//:://////////////////////////////////////////////
//:: Created By: BaaL
//:: Created On:
//:://////////////////////////////////////////////

int GetHasObject (object oCreature, object oItem)
{
object oItm = GetFirstItemInInventory(oCreature);
while(GetIsObjectValid(oItm))
  {
  if (oItm == oItem) return TRUE;
  oItm = GetNextItemInInventory(oCreature);
  }
return FALSE;
}

void main()
{
object oPC = GetFirstPC();
object oHench = GetHenchman(oPC);
object oSecPC = GetObjectByTag("SECOND_PC");
object oSecHench = GetObjectByTag("SECOND_HENCH");
object oCopy;
object oItem;
string sContainerTag;
object oContainer;
// Если нет хенча то скрипт не запускаетьсЯ.
if(!GetIsObjectValid(oHench)) return;
// plot PC
sContainerTag = "transit_cont1";
oContainer = CreateItemOnObject(sContainerTag, oSecPC);
oItem = GetFirstItemInInventory(oPC);
while(GetIsObjectValid(oItem))
  {
  if(GetPlotFlag(oItem))
    {
    if(GetBaseItemType(oItem) != BASE_ITEM_LARGEBOX)
      {
      oCopy = CopyItem(oItem, oContainer, TRUE);
      if(!GetHasObject(oContainer, oCopy))
        {
        DestroyObject(oCopy);
        oContainer = CreateItemOnObject(sContainerTag, oSecPC);
        oCopy = CopyItem(oItem, oContainer, TRUE);
        }
      DestroyObject(oItem);
      }
    }
  oItem = GetNextItemInInventory(oPC);
  }

// plot Hench
sContainerTag = "transit_cont2";
oContainer = CreateItemOnObject(sContainerTag, oSecHench);
oItem = GetFirstItemInInventory(oHench);
while(GetIsObjectValid(oItem))
  {
  if(GetPlotFlag(oItem))
    {
    if(GetBaseItemType(oItem) != BASE_ITEM_LARGEBOX)
      {
      oCopy = CopyItem(oItem, oContainer, TRUE);
      if(!GetHasObject(oContainer, oCopy))
        {
        DestroyObject(oCopy);
        oContainer = CreateItemOnObject(sContainerTag, oSecHench);
        oCopy = CopyItem(oItem, oContainer, TRUE);
        }
      DestroyObject(oItem);
      }
    }
  oItem = GetNextItemInInventory(oHench);
  }
// not plot PC
sContainerTag = "transit_cont1";
oContainer = CreateItemOnObject(sContainerTag, oSecPC);
oItem = GetFirstItemInInventory(oPC);
while(GetIsObjectValid(oItem))
  {
  if(!GetPlotFlag(oItem))
    {
    if(GetBaseItemType(oItem) != BASE_ITEM_LARGEBOX)
      {
      oCopy = CopyItem(oItem, oContainer, TRUE);
      if(!GetHasObject(oContainer, oCopy))
        {
        DestroyObject(oCopy);
        oContainer = CreateItemOnObject(sContainerTag, oSecPC);
        oCopy = CopyItem(oItem, oContainer, TRUE);
        }
      DestroyObject(oItem);
      }
    }
  oItem = GetNextItemInInventory(oPC);
  }
// not plot Hench
sContainerTag = "transit_cont2";
oContainer = CreateItemOnObject(sContainerTag, oSecHench);
oItem = GetFirstItemInInventory(oHench);
while(GetIsObjectValid(oItem))
  {
  if(!GetPlotFlag(oItem))
    {
    if(GetBaseItemType(oItem) != BASE_ITEM_LARGEBOX)
      {
      oCopy = CopyItem(oItem, oContainer, TRUE);
      if(!GetHasObject(oContainer, oCopy))
        {
        DestroyObject(oCopy);
        oContainer = CreateItemOnObject(sContainerTag, oSecHench);
        oCopy = CopyItem(oItem, oContainer, TRUE);
        }
      DestroyObject(oItem);
      }
    }
  oItem = GetNextItemInInventory(oHench);
  }
// Автоматически запускаем второй скрипт:
DelayCommand(0.5, ExecuteScript("bm_inv_transit2", OBJECT_SELF));
}

Neverwinter Script Source
//::///////////////////////////////////////////////
//:: FileName  bm_inv_transit2
//:: © 2005 WRG!
//:://////////////////////////////////////////////
/*
   Второй скрипт возвращает все вещи в инвентарь РС,
  раскладываЯ их по сумкам. По возможности заполнЯет
         уже имеющиесЯ у РС сумки (NEW!)
*/

//:://////////////////////////////////////////////
//:: Created By: BaaL
//:: Created On:
//:://////////////////////////////////////////////

void FindContainers(object oCreature)
{
int NN=0;
object oItm = GetFirstItemInInventory(oCreature);
while(GetIsObjectValid(oItm))
  {
  if(GetBaseItemType(oItm) == BASE_ITEM_LARGEBOX)
    {
    SetIdentified(oItm, TRUE);
    NN++;
    SetLocalInt(oCreature, "CONT_NUMBER", NN);
    SetLocalObject(oCreature, "CONTAINER"+IntToString(NN), oItm);
    }
  oItm = GetNextItemInInventory(oCreature);
  }
return;
}

int Ncont(object oCreature)
{
return GetLocalInt(oCreature, "CONT_NUMBER");
}

object GiveContainer(object oCreature, int NN)
{
return GetLocalObject(oCreature, "CONTAINER"+IntToString(NN));
}

void DeleteLocals(object oCreature)
{
int NN = Ncont(oCreature);
int NN1 = 1;
while (NN >= NN1)
  {
  DeleteLocalObject(oCreature, "CONTAINER"+IntToString(NN1));
  NN1++;
  }
DeleteLocalInt(oCreature, "CONT_NUMBER");
return;
}

int GetHasObject (object oCreature, object oItem)
{
object oItm = GetFirstItemInInventory(oCreature);
while(GetIsObjectValid(oItm))
  {
  if (oItm == oItem) return TRUE;
  oItm = GetNextItemInInventory(oCreature);
  }
return FALSE;
}

void main()
{
object oPC = GetFirstPC();
object oHench = GetHenchman(oPC);
object oSecPC = GetObjectByTag("SECOND_PC");
object oSecHench = GetObjectByTag("SECOND_HENCH");
object oCopy;
string sContainerTag;
int iContNumber = 1;
object oContainer;
object oItem = GetFirstItemInInventory(oHench);
while(GetIsObjectValid(oItem))
  {
  if(GetBaseItemType(oItem) == BASE_ITEM_LARGEBOX)
    {
    oCopy = CopyItem(oItem, oPC);
    DestroyObject(oItem);
    }
  oItem = GetNextItemInInventory(oHench);
  }
FindContainers(oPC);
///---///---
sContainerTag = "transit_cont1";
// oContainer = CreateItemOnObject(sContainerTag, oPC);
oContainer=(iContNumber>Ncont(oPC))?CreateItemOnObject(sContainerTag,oPC):GiveContainer(oPC,iContNumber);
oItem = GetFirstItemInInventory(oSecPC);
while(GetIsObjectValid(oItem))
  {
    if(GetBaseItemType(oItem) != BASE_ITEM_LARGEBOX && GetTag(oItem) != sContainerTag)
      {
      oCopy = CopyItem(oItem, oContainer, TRUE);
      // esli item v sumku ne vlez  - sozdaem novuyu
      if(!GetHasObject(oContainer, oCopy))
        {
        DestroyObject(oCopy);
        // oContainer = CreateItemOnObject(sContainerTag, oPC);
        iContNumber++;
        oContainer=(iContNumber>Ncont(oPC))?CreateItemOnObject(sContainerTag,oPC):GiveContainer(oPC,iContNumber);
        oCopy = CopyItem(oItem, oContainer, TRUE);
        }
      // uni4tojaem original
      DestroyObject(oItem);
      }
  oItem = GetNextItemInInventory(oSecPC);
  }

///---///---
sContainerTag = "transit_cont2";
// oContainer = CreateItemOnObject(sContainerTag, oPC);
iContNumber++;
oContainer=(iContNumber>Ncont(oPC))?CreateItemOnObject(sContainerTag,oPC):GiveContainer(oPC,iContNumber);
oItem = GetFirstItemInInventory(oSecHench);
while(GetIsObjectValid(oItem))
  {
    if(GetBaseItemType(oItem) != BASE_ITEM_LARGEBOX && GetTag(oItem) != sContainerTag)
      {
      oCopy = CopyItem(oItem, oContainer, TRUE);
      // esli item v sumku ne vlez  - sozdaem novuyu
      if(!GetHasObject(oContainer, oCopy))
        {
        DestroyObject(oCopy);
        // oContainer = CreateItemOnObject(sContainerTag, oPC);
        iContNumber++;
        oContainer=(iContNumber>Ncont(oPC))?CreateItemOnObject(sContainerTag,oPC):GiveContainer(oPC,iContNumber);
        oCopy = CopyItem(oItem, oContainer, TRUE);
        }
      // uni4tojaem original
      DestroyObject(oItem);
      }
  oItem = GetNextItemInInventory(oSecHench);
  }

///---///---
sContainerTag = "transit_cont3";
oContainer = CreateItemOnObject(sContainerTag, oPC);
int iSlot = 0;
oItem = GetItemInSlot(iSlot, oHench);
while (iSlot < 14)
  {
  if(GetIsObjectValid(oItem))
    {
    oCopy = CopyItem(oItem, oContainer, TRUE);
    // esli item v sumku ne vlez  - sozdaem novuyu
    if(!GetHasObject(oContainer, oCopy))
      {
      DestroyObject(oCopy);
      oContainer = CreateItemOnObject(sContainerTag, oPC);
      oCopy = CopyItem(oItem, oContainer, TRUE);
      }
    // uni4tojaem original
    DestroyObject(oItem);
    }
  iSlot ++;
  oItem = GetItemInSlot(iSlot, oHench);
  }
DeleteLocals(oPC);

oItem = GetFirstItemInInventory(oSecPC);
while(GetIsObjectValid(oItem))
  {
  DestroyObject(oItem);
  oItem = GetNextItemInInventory(oSecPC);
  }
oItem = GetFirstItemInInventory(oSecHench);
while(GetIsObjectValid(oItem))
  {
  DestroyObject(oItem);
  oItem = GetNextItemInInventory(oSecHench);
  }
}

Neverwinter Script Source
//::///////////////////////////////////////////////
//:: FileName  bm_inv_transit3
//:: © 2005 WRG!
//:://////////////////////////////////////////////
/*
   Третий скрипт запускаетьсЯ уже в новом модуле
      после того как присоеденен хенч. Скрипт
   раскладывает вещи в инвентаре хенча и копирует
     вещи РС монстру, попутно уничтожаЯ Ящики.
*/

//:://////////////////////////////////////////////
//:: Created By: BaaL
//:: Created On:
//:://////////////////////////////////////////////
int GetSuitableSlot(object oItem)
{
int iSlot;
switch  (GetBaseItemType(oItem))
  {
  case BASE_ITEM_AMULET:         iSlot = INVENTORY_SLOT_NECK;      break;
  case BASE_ITEM_ARMOR:          iSlot = INVENTORY_SLOT_CHEST;     break;
  case BASE_ITEM_ARROW:          iSlot = INVENTORY_SLOT_ARROWS;    break;
  case BASE_ITEM_BASTARDSWORD:   iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_BATTLEAXE:      iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_BELT:           iSlot = INVENTORY_SLOT_BELT;      break;
  case BASE_ITEM_BOLT:           iSlot = INVENTORY_SLOT_BOLTS;     break;
  case BASE_ITEM_BOOTS:          iSlot = INVENTORY_SLOT_BOOTS;     break;
  case BASE_ITEM_BRACER:         iSlot = INVENTORY_SLOT_ARMS;      break;
  case BASE_ITEM_BULLET:         iSlot = INVENTORY_SLOT_BULLETS;   break;
  case BASE_ITEM_CLOAK:          iSlot = INVENTORY_SLOT_CLOAK;     break;
  case BASE_ITEM_CLUB:           iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_DAGGER:         iSlot = INVENTORY_SLOT_LEFTHAND;  break;
  case BASE_ITEM_DART:           iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_DIREMACE:       iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_DOUBLEAXE:      iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_DWARVENWARAXE:  iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_GLOVES:         iSlot = INVENTORY_SLOT_ARMS;      break;
  case BASE_ITEM_HALBERD:        iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_HANDAXE:        iSlot = INVENTORY_SLOT_LEFTHAND;  break;
  case BASE_ITEM_HEAVYCROSSBOW:  iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_HEAVYFLAIL:     iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_HELMET:         iSlot = INVENTORY_SLOT_HEAD;      break;
  case BASE_ITEM_KAMA:           iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_KATANA:         iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_KUKRI:          iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_LARGESHIELD:    iSlot = INVENTORY_SLOT_LEFTHAND;  break;
  case BASE_ITEM_LIGHTCROSSBOW:  iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_LIGHTFLAIL:     iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_LIGHTHAMMER:    iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_LIGHTMACE:      iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_LONGBOW:        iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_LONGSWORD:      iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_MAGICSTAFF:     iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_MORNINGSTAR:    iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_QUARTERSTAFF:   iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_RAPIER:         iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_RING:           iSlot = INVENTORY_SLOT_RIGHTRING; break;
  case BASE_ITEM_SCIMITAR:       iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_SCYTHE:         iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_SHORTBOW:       iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_SHORTSPEAR:     iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_SHORTSWORD:     iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_SHURIKEN:       iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_SLING:          iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_SMALLSHIELD:    iSlot = INVENTORY_SLOT_LEFTHAND;  break;
  case BASE_ITEM_THROWINGAXE:    iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_TORCH:          iSlot = INVENTORY_SLOT_LEFTHAND;  break;
  case BASE_ITEM_TOWERSHIELD:    iSlot = INVENTORY_SLOT_LEFTHAND;  break;
  case BASE_ITEM_TWOBLADEDSWORD: iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  case BASE_ITEM_WARHAMMER:      iSlot = INVENTORY_SLOT_RIGHTHAND; break;
  }
return iSlot;
}

void main()
{
object oPC = GetFirstPC();
object oHench = GetHenchman(oPC);
object oSecPC = GetObjectByTag("SECOND_PC");
object oCopy;
object oContainer;
object oItem2;
object oItem = GetFirstItemInInventory(oPC);
// Если нет чемодана "transit_cont3" (это значит скрипты 1 и 2 не запускались,
// т.е. хенч в новый модуль не перешел), то удалЯем хенча в новом модуле
// и останавливаем скрипт
if(!GetIsObjectValid(GetItemPossessedBy(oPC, "transit_cont3")))
  {
  DestroyObject(oHench);
  return;
  }
AssignCommand(oHench, ClearAllActions());
while (GetIsObjectValid(oItem))
  {
  ///+++
  if(GetTag(oItem) == "transit_cont1")
    {
    oContainer = oItem;
    oItem2 = GetFirstItemInInventory(oContainer);
    while (GetIsObjectValid(oItem2))
      {
      oCopy = CopyItem(oItem2, oSecPC, TRUE);
      DestroyObject(oItem2);
      oItem2 = GetNextItemInInventory(oContainer);
      }
    DestroyObject(oContainer);
    }
  ///---
  ///+++
  if(GetTag(oItem) == "transit_cont2")
    {
    oContainer = oItem;
    oItem2 = GetFirstItemInInventory(oContainer);
    while (GetIsObjectValid(oItem2))
      {
      oCopy = CopyItem(oItem2, oHench, TRUE);
      DestroyObject(oItem2);
      oItem2 = GetNextItemInInventory(oContainer);
      }
    DestroyObject(oContainer);
    }
  ///---
  ///+++
  if(GetTag(oItem) == "transit_cont3")
    {
    oContainer = oItem;
    oItem2 = GetFirstItemInInventory(oContainer);
    while (GetIsObjectValid(oItem2))
      {
      oCopy = CopyItem(oItem2, oHench, TRUE);
      SetIdentified(oCopy, TRUE);
      AssignCommand(oHench, ActionEquipItem(oCopy, GetSuitableSlot(oCopy)));
      DestroyObject(oItem2);
      oItem2 = GetNextItemInInventory(oContainer);
      }
    DestroyObject(oContainer);
    }
  ///---
  oItem = GetNextItemInInventory(oPC);
  }
// Автоматически запускаем четвертый скрипт:
DelayCommand(0.5, ExecuteScript("bm_inv_transit4", OBJECT_SELF));
}

Neverwinter Script Source
//::///////////////////////////////////////////////
//:: FileName  bm_inv_transit4
//:: © 2005 WRG!
//:://////////////////////////////////////////////
/*
      Четвертый скрипт возвращает вещи РС
*/

//:://////////////////////////////////////////////
//:: Created By: BaaL
//:: Created On:
//:://////////////////////////////////////////////
void main()
{
object oPC = GetFirstPC();
object oSecPC = GetObjectByTag("SECOND_PC");
object oCopy;
object oItem = GetFirstItemInInventory(oSecPC);
while (GetIsObjectValid(oItem))
  {
  oCopy = CopyItem(oItem, oPC, TRUE);
  DestroyObject(oItem);
  oItem = GetNextItemInInventory(oSecPC);
  }
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
][umepa
сообщение Mar 27 2005, 09:32
Сообщение #70


Level 3
*

Класс: Некромант
Характер: Neutral Evil
Раса: Человек



скрипт чтобы NPC шел за игроком. Будет идти даже после окончания боя.
1создаёте диалог. на вкладке ACTION TAKEN пишите команду

Neverwinter Script Source
void main()
{
object oPC = GetPCSpeaker();
ActionForceFollowObject(oPC, 1.0);
SetLocalObject(OBJECT_SELF, "PC_TO_FOLLOW", oPC);
}


cтавьте на ветку диалога.
2теперь в скрипте OnSpawn надо раскомментировать строчку SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT);
раскомментировать значит убрать вот такой знак // т.е просто стираете эти слэши.У меня в скрипте подобной комадны сразу не было я вставил сразу ту о которой говорил выше
3 теперь в скрипте OnUserDefined пишите
Neverwinter Script Source
void main()
{
int nEvent = GetUserDefinedEventNumber();
if (nEvent == EVENT_HEARTBEAT)
  {
  object oPC = GetLocalObject(OBJECT_SELF, "PC_TO_FOLLOW");
  // если ПС не определен ИЛИ идет бой -> прервать сценарий
  if(!GetIsObjectValid(oPC) || GetIsInCombat() ) return;
  ActionForceFollowObject(oPC, 1.0);
  }
}


не забудьте сохранить стандартный скрипт OnUserDefined,а новый скрипт под другим именем
вот вроде и всё.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
RiPPeR
сообщение Apr 27 2005, 10:13
Сообщение #71


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

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




СЕРИЯ "СКРИПТЫ ДЛЯ ШАРДА"
ЦИКЛ "СКРИПТЫ RIPPER'a"


Я написал пару простых, но очень полезный скриптов для шардов, на них "нанизываются" все остальные примочки.

Что я сделал:
  • Индексацию игроков
  • Защита их аккаунтов от взлома
  • Сохранение локации и координат игрока после рестарта сервера
  • ДМ палка для управления игроками
Все скрипты взаимосвязанны.

pl_onlogon.nss (поставить в OnClientEnter модуля)
Neverwinter Script Source
//  ===========================================
//  pl_on_logon.nss             12.12.04                                            
//    © RiPPeR                                                                            
//                  glebkk@xaker.ru                                                     
//  ===========================================  

#include "main_spirit"

void main()
{
object oPlayer = GetEnteringObject();
object oSpirit = GetPlayerSpirit(oPlayer);
string ID = IntToString(GetLocalInt(oSpirit, "ID"));
string sAccount = GetPCPlayerName(oPlayer);

string sDB_CDKEY = GetCampaignString("db",sAccount+"_CDKEY");
string sPC_CDKEY = GetPCPublicCDKey(oPlayer);

if (GetStringLength(sDB_CDKEY) <= 1) //Нет записи в базе данных
  SetCampaignString("db",sAccount+"_CDKEY",sPC_CDKEY);
else
if (sDB_CDKEY != sPC_CDKEY)
  BootPC(oPlayer);

if (oSpirit == OBJECT_INVALID) //Новый персонаж
  {
  oSpirit = CreateItemOnObject("spirit", GetEnteringObject(), 1);

  int nCounter = GetCampaignInt("db","pl_Counter") + 1;

  SetLocalInt(oSpirit,"ID",nCounter);
  SetCampaignInt("db","pl_Counter",nCounter);

  ID = IntToString(nCounter);
  }
else //Старый
  {
  }

SetLocalInt(oSpirit,"bFlaged",1);
SetLocalInt(oSpirit,"bConnected",1);
}


pl_on_logoff.nss (поставить в OnClientLeave модуля)

Neverwinter Script Source
//  ===========================================
//  pl_on_logoff.nss             12.12.04                                            
//    © RiPPeR                                                                            
//                  glebkk@xaker.ru                                                     
//  ===========================================  

#include "main_spirit"

void main()
{
object oPlayer = GetExitingObject();
object oSpirit = GetPlayerSpirit(oPlayer);

string ID = IntToString(GetLocalInt(oSpirit,"ID"));

SetLocalInt(oSpirit,"bConnected",0);
}


default.nss
Neverwinter Script Source
//  ===========================================
//  default.nss             12.12.04                                            
//    © RiPPeR                                                                            
//                  glebkk@xaker.ru                                                     
//  ===========================================  

#include "main_spirit"

void main()
{
object oPlayer = OBJECT_SELF;
object oSpirit = GetPlayerSpirit(oPlayer);

vector vPos = GetPosition(oPlayer);

if (GetLocalInt(oSpirit,"bFlaged") == 0)
  {
  SetLocalFloat(oSpirit,"pos_x",vPos.x);
  SetLocalFloat(oSpirit,"pos_y",vPos.y);
  SetLocalFloat(oSpirit,"pos_z",vPos.z);
  SetLocalFloat(oSpirit,"pos_angle",VectorToAngle(vPos));
  }
else
  SetLocalInt(oSpirit,"bFlaged",0);
}

main_spirit.nss (просто инклуд)
Neverwinter Script Source
//  ===========================================
//  main_spirit.nss             12.12.04                                            
//    © RiPPeR                                                                            
//                  glebkk@xaker.ru                                                     
//  ===========================================  

object GetPlayerSpirit(object oPlayer);

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

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

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

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


main_active_item.nss
Neverwinter Script Source
//  ===========================================
//  main_active_item.nss             12.12.04                                            
//    © RiPPeR                                                                            
//                  glebkk@xaker.ru                                                     
//  ===========================================  

#include "main_spirit"

void main()
{
object oPlayer = GetItemActivator();
object oItem = GetItemActivated();
object oTarget = GetItemActivatedTarget();

string sResRef = GetResRef(oItem);
string sTag = GetTag(oItem);

if (sResRef == "dm_wand")
//if (GetIsDM(oPlayer)) //Раскомментировать, если ДМ-палку может использовать только ДМ
  {
  AssignCommand(oPlayer,ActionStartConversation(oPlayer,"dm_wand_pl_list",TRUE,FALSE));
  ExecuteScript("dm_ban_info",oPlayer);
  SpeakString("DM_WAND ACT",TALKVOLUME_SHOUT);
  }
}


m_def_loc_enter.nss (ставить на OnEnter _всех_ локаций, _кроме_ стартовой)
Neverwinter Script Source
//  ===========================================
//  m_def_loc_enter.nss             12.12.04                                            
//    © RiPPeR                                                                            
//                  glebkk@xaker.ru                                                     
//  ===========================================  

#include "main_spirit"

void main()
{
object oArea = OBJECT_SELF;
object oPlayer = GetEnteringObject();
object oSpirit = GetPlayerSpirit(oPlayer);

string sTag = GetTag(oArea);
string sResRef = GetResRef(oArea);

SetLocalString(oSpirit, "pos_area", sTag);
ExecuteScript(sResRef,oArea); //Раскомментироваться для запуска OnEnter локи скрипта с именем - рес-реф'ом локи
}

m_loc_saver.nss
Сделать локацию 2х2.
Туда поставить таким образом триггеры:
CODE

====
=**=
=**=
====

= - Тригеры для перехода
* - Тригер с этим скриптом

В центре тригера со скриптом поставить стартовый вэйпоинт.

Neverwinter Script Source
//  ===========================================
//  m_loc_saver.nss             12.12.04                                            
//    © RiPPeR                                                                            
//                  glebkk@xaker.ru                                                     
//  ===========================================  

#include "main_spirit"

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

  vector vPlayer;
  location lPlayer;
  object oArea;

  float x = GetLocalFloat(oSpirit,"pos_x");
  float y = GetLocalFloat(oSpirit,"pos_y");
  float z = GetLocalFloat(oSpirit,"pos_z");
  float angle = GetLocalFloat(oSpirit,"pos_angle");

  string sArea = GetLocalString(oSpirit,"pos_area");

  vPlayer = Vector(x,y,z);
  oArea = GetObjectByTag(sArea);

  lPlayer = Location(oArea,vPlayer,angle);

  SetLocalInt(oSpirit,"bConnected",1);
  AssignCommand(oPlayer,ActionJumpToLocation(lPlayer));
}

dm_ban_boot.nss
Neverwinter Script Source
//  ===========================================
//  dm_ban_boot.nss             12.12.04                                            
//    © RiPPeR                                                                            
//                  glebkk@xaker.ru                                                     
//  ===========================================  

#include "main_spirit"

void main()
{
int nID = GetLocalInt(OBJECT_SELF,"DM_WAND_ID");

object oPlayer = GetFirstPC();
object oSpirit;

while (oPlayer != OBJECT_INVALID)
  {
  oSpirit = GetPlayerSpirit(oPlayer);

  if (GetLocalInt(oSpirit,"ID") == nID)
    {
    BootPC(oPlayer);
    break;
    }
  }
}


dm_ban_info.nss
Neverwinter Script Source
//  ===========================================
//  dm_ban_info.nss             12.12.04                                            
//    © RiPPeR                                                                            
//                  glebkk@xaker.ru                                                     
//  ===========================================  

#include "main_spirit"

string PlayerList(object oPC);
object GetPCByPlaceNum(int num);
int GetPCAmount();

string GetGoodEvil(object oPC);
string GetLawChaotic(object oPC);

void main()
{
int num = GetLocalInt(OBJECT_SELF,"DM_WAND_NUM");
int player_amount = GetPCAmount();

if (num == 0)
  num = player_amount;

if (num > player_amount)
  num = 1;

object oPC = GetPCByPlaceNum(num);
int ID = GetLocalInt(GetPlayerSpirit(oPC),"ID");

SetLocalInt(OBJECT_SELF,"DM_WAND_NUM",num);
SetLocalInt(OBJECT_SELF,"DM_WAND_ID",ID);

string sPlayerList = PlayerList(oPC);

SetCustomToken(1999, sPlayerList);
}

string PlayerList(object oPC)
{
//object oPC = GetFirstPC();
string Text = "  Информация о персонаже  \n";

string Account = GetPCPlayerName(oPC);
string Name = GetName(oPC);
string ID = IntToString(GetLocalInt(GetPlayerSpirit(oPC),"ID"));
string CD_KEY = GetPCPublicCDKey(oPC);
string IP = GetPCIPAddress(oPC);

string Level = IntToString(GetLevelByPosition(1, oPC) + GetLevelByPosition(2, oPC) + GetLevelByPosition(3, oPC));
string BadGood = GetGoodEvil(oPC);
string ChaoticLaw = GetLawChaotic(oPC);
string ThisHP = IntToString(GetCurrentHitPoints(oPC));
string MaxHP = IntToString(GetMaxHitPoints(oPC));
string AC = IntToString(GetAC(oPC));

string Area = GetName(GetArea(oPC));

Text += "<cццц>"+"-----------------------------\n";
Text += "<cццц>"+"Аккаунт: "+"<cк>"+Account+"\n";
Text += "<cццц>"+"Имя персонажа: "+"<cк>"+Name+"\n";
Text += "<cццц>"+"ID: "+"<cк>"+ID+"\n";
Text += "<cццц>"+"PUBLIC CD KEY: "+"<cк>"+CD_KEY+"\n";
Text += "<cццц>"+"IP: "+"<cк>"+IP+"\n";
Text += "<cццц>"+"\n";
Text += "<cццц>"+"Уровень: "+"<cк>"+Level+"\n";
Text += "<cццц>"+"Хороший/Злой: "+"<cк>"+BadGood+"\n";
Text += "<cццц>"+"Хаотичный/Порядочный: "+"<cк>"+ChaoticLaw+"\n";
Text += "<cццц>"+"HP: "+"<cк>"+ThisHP+"/"+"<cк>"+MaxHP+"\n";
Text += "<cццц>"+"AC: "+"<cк>"+AC+"\n";
Text += "<cццц>"+"Локация: "+"<cк>"+Area+"\n";

return Text;
}

object GetPCByPlaceNum(int num)
{
object oPC = GetFirstPC();
int num2 = 0;

for (num2 = 0; num2 < num - 1; num2++)
  oPC = GetNextPC();

return oPC;
}

int GetPCAmount()
{
object oPC = GetFirstPC();
int num = 0;

while (oPC != OBJECT_INVALID)
  {
  num++;
  oPC = GetNextPC();
  }

return num;
}

string GetGoodEvil(object oPC)
{
int ret = GetAlignmentGoodEvil(oPC);

if (ret == ALIGNMENT_GOOD)
  return "GOOD";

if (ret == ALIGNMENT_EVIL)
  return "EVIL";

if (ret == ALIGNMENT_NEUTRAL)
  return "NEUTRAL";

return "OBJECT_INVALID";
}

string GetLawChaotic(object oPC)
{
int ret = GetAlignmentLawChaos(oPC);

if (ret == ALIGNMENT_LAWFUL)
  return "LAWFUL";

if (ret == ALIGNMENT_CHAOTIC)
  return "CHAOTIC";

if (ret == ALIGNMENT_NEUTRAL)
  return "NEUTRAL";

return "OBJECT_INVALID";
}

dm_ban_minus.nss
Neverwinter Script Source
//  ===========================================
//  dm_ban_minus.nss             12.12.04                                            
//    © RiPPeR                                                                            
//                  glebkk@xaker.ru                                                     
//  ===========================================  

void main()
{
SetLocalInt(OBJECT_SELF,"DM_WAND_NUM",GetLocalInt(OBJECT_SELF,"DM_WAND_NUM") - 1);
ExecuteScript("dm_ban_info",OBJECT_SELF);
ExecuteScript("dm_w_return",OBJECT_SELF);
}

dm_ban_plus.nss
Neverwinter Script Source
//  ===========================================
//  dm_ban_plus.nss             12.12.04                                            
//    © RiPPeR                                                                            
//                  glebkk@xaker.ru                                                     
//  ===========================================  

void main()
{
SetLocalInt(OBJECT_SELF,"DM_WAND_NUM",GetLocalInt(OBJECT_SELF,"DM_WAND_NUM") + 1);
ExecuteScript("dm_ban_info",OBJECT_SELF);
ExecuteScript("dm_w_return",OBJECT_SELF);
}

dm_w_return.nss
Neverwinter Script Source
//  ===========================================
//  dm_w_return.nss             12.12.04                                            
//    © RiPPeR                                                                            
//                  glebkk@xaker.ru                                                     
//  ===========================================  

void main()
{
ExecuteScript("dm_ban_info",OBJECT_SELF);
AssignCommand(OBJECT_SELF,ActionStartConversation(OBJECT_SELF,"dm_wand_pl_list",TRUE,FALSE));
}


Для работы скриптов ДМ-посоха нужно:
Создать любой итем с рес-реф'ом "dm_wand" и Уник Повером.
Создать диалог dm_wand_pl_list

Структура диалога:
CODE

[OWNER] - <CUSTOM1999>
       |
Запутить (ActionTaken - dm_ban_boot)
Следующий игрок (ActionTaken - dm_ban_plus)
Предыдущий игрок (ActionTaken - dm_ban_minus)
Выход


Это чисто пример по созданию посоха, можно легко модернизировать во что-то оч. хорошее :). Дерзайте

Кроме того обязательно нужно создать в палитре новый итем с тагом "Spirit", ResRef'ом "spirit", Undropable

p.s. у кого проблемы с установкой пишите в приват.

МОДУЛЬ МОЖНО СКАЧАТЬ ТУТ

Сообщение отредактировал RiPPeR - Apr 30 2005, 07:49
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jun 9 2005, 09:39
Сообщение #72


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

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



Тут мне понадобились факела включаемые. Помнится кто-то из молодежи спрашивал как сделать. Вот скрипт и демка в виде файла.
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: OnEnter  am_ten_torch_on
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
    ВКЛЮЧАЕМ ОГОНЬ ФАКЕЛОВ И ЗВУК К НИМ НОЧЬЮ.

Таг факела = "AM_PLS_TORCH_ON". Он должен быть с
активированной анимацией и отключена опция Static.
Звуковой объект ставим рядом с факелом, помните его таг
ДОЛЖЕН БЫТЬ УНИКАЛЬНЫМ ВО ВСЕМ МОДУЛЕ. Иначе не
сработает. К примеру таг моего звука, равен тагу
триггера плюс порядковый номер, начиная с еденицы:
AM_SOUND_TORTCH_(порядковый номер = i). Расставляйте
на локации факела и звуки рядом. Все готово!

*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 08.06.2005
//:://///////////////////////////////////////////
#include "am_inc_debug"
void main()
{
  int i=1; // Первый порядковый номер тага звука
  float f=0.5; // Задержка включения
  float r=f+0.2; // Задержка пересчета освещения
  object oPC = GetEnteringObject();
  string sSound = GetTag(OBJECT_SELF); // Приравнял таг триггера к звуовому
  object oTorch = GetFirstObjectInArea(OBJECT_SELF);
  object oSound = GetObjectByTag(sSound+IntToString(i)); // Звуковой объект
  if (!GetIsPC(oPC)) {return;}
//---------------------------------- ДЕНЬ --------------------------------------
  if (GetIsDay() && !GetLocalInt(OBJECT_SELF, "DEACTIVATED"))
     // Если день но факела горят
  {
  while (GetIsObjectValid(oTorch))
      {
       if (GetTag(oTorch) == "AM_PLS_TORCH_ON" && !GetLocalInt(oTorch, "LIGHT_OFF"))
         /* Проверяем все объекты на локации, берем с нужным тегом и без
             локальной переменной, что с объектом уже выключен. */

          {
          SetLocalInt(oTorch, "LIGHT_OFF", TRUE);
          AssignCommand(oTorch, PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE));
          DelayCommand(f, SetPlaceableIllumination(oTorch, FALSE));
          DelayCommand(r, RecomputeStaticLighting(GetArea(oTorch)));
          Debug(FloatToString(f));
          Debug(FloatToString®);
          f=f+0.4; // Сделай паузу!
          r=f+0.2; // Глотни-ка тоже, фанты.
        /* Каджый факел заставим съесть Твикс. И прересчитаем свет позже. Не
           должно быть рывков, но если они все же появились, увеличьте немного, на 0.2,
           к примеру. Если и потом не пропали, то выкиньте ваш компьютер в окно,
           Это надо было сделать года два назад.                                  */

          }
          if (GetIsObjectValid(oSound))
             {
             SoundObjectStop(oSound); // Выключаем звук
             i++;  // Присвоим объекту звука таг на единицу больше
             }
       oSound = GetObjectByTag("AM_SOUND_TORCH_"+IntToString(i));
       oTorch = GetNextObjectInArea(OBJECT_SELF);
      }
   SetLocalInt(OBJECT_SELF, "DEACTIVATED", TRUE);
   }
//----------------------------- НОЧЬ -------------------------------------------
  if (GetIsNight() && GetLocalInt(OBJECT_SELF, "DEACTIVATED"))
     // Если ночь но мы затушили факела
  {
  while (GetIsObjectValid(oTorch))
      {
       if (GetTag(oTorch) == "AM_PLS_TORCH_ON" && GetLocalInt(oTorch, "LIGHT_OFF"))
           {
          SetLocalInt(oTorch, "LIGHT_OFF", FALSE);
          AssignCommand(oTorch, PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE));
          DelayCommand(f, SetPlaceableIllumination(oTorch, TRUE));
          DelayCommand(r, RecomputeStaticLighting(GetArea(oTorch)));
          Debug(FloatToString(f));
          Debug(FloatToString®);
          f=f+0.4;
          r=f+0.2;
          }
          if (GetIsObjectValid(oSound))
             {
             SoundObjectPlay(oSound); // Включаем звук
             i++; // Присвоим объекту звука таг на единицу больше
             }
       oSound = GetObjectByTag("AM_SOUND_TORCH_"+IntToString(i));
       oTorch = GetNextObjectInArea(OBJECT_SELF);
      }
   SetLocalInt(OBJECT_SELF, "DEACTIVATED", FALSE); // ЧТо бы один раз сработало
   return;
   }
}

Добавлено в [mergetime]1118299586[/mergetime]
CODE
Блин, парсется (r) на ®, заккоментрируйте строку в скрипте или исправьте Debug(FloatToString®);

Добавлено в [mergetime]1118299909[/mergetime]
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Name: am_inc_common
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
          БИБЛИОТЕКА ДЛЯ ОТЛАДКИ СКРИПТОВ
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan      Aiwan@e-mail.ru
//:: Created On: 30.05.2005
//:://////////////////////////////////////////////

// СООБЩЕНИЯ ДЛЯ ПРОВЕРКИ (ИСПОЛЬЗУЮТСЯ В СЛУЖЕБНЫХ ЦЕЛЯХ ДЛЯ ОТЛАДКИ КОДА СКРИПТОВ)
// А ТАК ЖЕ ДЛЯ ДМ-ов
// LocalInt - "DEBAG_PC" на модуле, отключит дебаг игрокам
// LocalInt - "DEBAG_DM" на модуле, отключит дебаг DM-ам
void Debug(string message);
// Выводит в Debug: TAG, ResRef и Name объекта.
void DebugObject(object oObject);

//------------------------------------------------------------------------------
void Debug(string message)
{
    object oPC = GetFirstPC();
    if (!GetLocalInt(GetModule(), "DEBAG_PC"))
    {
      SendMessageToPC(oPC, "Debag message: "+message);
    }
    if (!GetLocalInt(GetModule(), "DEBAG_DM"))
          {
            SendMessageToAllDMs("Debag message to DMs: "+message);
          }
}
void DebugObject(object oObject)
{
    string sTag = GetTag(oObject);
    string sResRef = GetResRef(oObject);
    string sName = GetName(oObject);
    Debug ("TAG = "+sTag+", ResRef = "+sResRef+",  Name = "+sName+".");
}
/*
void main(){}

Прикрепленные файлы
Прикрепленный файл  demo_mod.rar ( 9.63 килобайт ) Кол-во скачиваний: 76
 
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Buldog
сообщение Jun 23 2005, 20:21
Сообщение #73


Level 5
**

Класс: Мастер Оружия
Характер: Chaotic Neutral
Раса: Полуорк



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

И вылилась идейка вот в такой скрипт:
Neverwinter Script Source
//////////////////////////////////////
//////////////////////////////////////
//////For Area Transmition Trigers////
//////////////////////////////////////
//////////OnClick Script//////////////
//////////////////////////////////////
////////////Created By Buldog/////////
////////////////23.06.05//////////////
//////////////////////////////////////
//////////////////////////////////////

void main()
{
    object oPC = GetClickingObject();
    object oTarget = GetTransitionTarget(OBJECT_SELF);
    object oTArea = GetArea(oTarget);

    location lTarget;

    vector vPC = GetPosition(oPC);
    vector vTarget = GetPosition(oTarget);
    vector vTLoc = Vector();

    vTLoc.z = vPC.z;

    if(vPC.x < 10.0 || vPC.x > vTarget.x * 2 - 10) vTLoc.x = vTarget.x * 2 - vPC.x;
    else vTLoc.x = vPC.x;

    if(vPC.y < 10.0 || vPC.y > vTarget.y * 2 - 10) vTLoc.y = vTarget.y * 2 - vPC.y;
    else vTLoc.y = vPC.y;

    float fFace = GetFacing(oPC);

    lTarget = Location(oTArea, vTLoc, fFace);

    AssignCommand(oPC, ClearAllActions());
    AssignCommand(oPC, ActionJumpToLocation(lTarget));
}


Подготовка местности:

- В ЦЕНТР (и чем точнее тем лучше) нужной локации помещаем вейпоинт и задаем ему уникальный тэг.
- В локации из которой будем выходить помещаем тригер со скриптом, в поле для тэга точки назначения помещаем тэг размещенного в центре целевой локации вэйпоинта.

Ограничения:

- Тригер перехода должен размещаться по краю локации и не вылезать по ширине (или высоте, смотря с какой стороны находится) за пределы одной клетки.
- Не размещайте тригер в угловых клетках, будет глючить.
- Ширина (высота) тригера не должна превышать ширины (высоты) локации назначения.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Jun 24 2005, 21:22
Сообщение #74


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

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



Функция для библиотеки. Выдает любому уровню процент ХР заданный вами. К примеру у вас квестов 10. Зашел РС 30 левелом или 5 -м, всеравно выполнив 10 квестов он наберет 1 левел...
Neverwinter Script Source
//::///////////////////////////////////////////////
//:: Name: am_inc_dialog
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
          БИБЛИОТЕКА ДЛЯ ДИАЛОГОВ
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan      Aiwan@e-mail.ru
//:: Created On: 22.06.2005
//:://////////////////////////////////////////////
#include "am_inc_debug"

// ФУНКЦИЯ РАЗДЕЛЕНИЯ ХР В ЗАВИСИМОСТИ ОТ УРОВНЯ
// iPercent - Проценты от уровня. По умолчанию 10%
void GiveXPScale(object oPC, int iPercent=10);

//------------------------------------------------------------------------------
void GiveXPScale(object oPC, int iPercent=10)
{
    object oCreature;
    int iHit = GetHitDice(oPC); // Берем уровень объекта
    int iXP; // Это искомое число ХР для квеста
    int i = iHit*1000; // Это ХР на один уровень больше чем у объекта
    iXP= i/iPercent;
    Debug("Уровень ХР на один больше нашего - "+IntToString(i));
    Debug("Процент добавляемого ХР от уровня - "+IntToString(iPercent));
    Debug("Искомая сумма ХР - "+IntToString(iXP));
    /*
    Нужное количество ХР равно ХР на уровень больше, деленное на число
    int iP, которое определяет процент от уровня. По умолчанию это 10%.
    */

    GiveXPToCreature(oPC,iXP);
}
/*
void main(){}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Friedrich
сообщение Aug 10 2005, 22:15
Сообщение #75


Level 5
**

Класс: Рейнджер
Характер: Neutral Good
Раса: Человек



Вот маленький инклюд с функцией makeTrace изображает дымную трассу (типа как от ракеты) между двумя точками, с помощью виз. эффектов (н.п. VFX_FNF_SMOKE_PUFF).
Что-то похожее было в первом модуле СоУ в подземелье с плохой эльфой.
Neverwinter Script Source
// ********************************* //
// * fh_inc_trace                  * //
// * (с) Friedrich W. Heik, 2005.  * //
// * darkowl@inbox.ru              * //
// ********************************* //

//** Interface **

// Преобразует декартовы координаты в сферические
// Возвращаемый вектор имеет формат:
// x - ro:  расстояние от начала координат до точки
// y - fi:  угол поворота, вокруг вертикальной оси (от оси X против ч.с.)
// z - psi: угол наклона от горизонтальной плоскости
vector sph(vector vDsc);

// Преобразует сферические координаты в декартовы
// Формат вектора vSph:
// x - ro:  расстояние от начала координат до точки
// y - fi:  угол поворота, вокруг вертикальной оси (от оси X против ч.с.)
// z - psi: угол наклона от горизонтальной плоскости
vector dsc(vector vSph);

// Изменяет абс. величину вектора
// Возвр. вектор длиною fMagnitude, сонаправленный с vVector.
vector setMagnitude(vector vVector, float fMagnitude);

// Рисует дымную трассу между двумя точками
// lSource:  Начало трассы
// lTarget:  Цель
// fJump:    Дистанция шага между эффектами, м.
// fSpeed:    Скорость "снаряда", м/с
// nTraceVFX: эффект дыма, которым рисуется трасса
// nBurstVFX: эффект взрыва в конце трассы (исп. -1 (VFX_NONE), если взрыв не требуется) 
void makeTrace(location lSource, location lTarget, float fJump = 0.25f, float fSpeed = 10.0f, int nTraceVFX = VFX_FNF_SMOKE_PUFF, int nBurstVFX = VFX_FNF_FIREBALL);


//** Implementation **

// Преобразует декартовы координаты в сферические
// Возвращаемый вектор имеет формат:
// x - ro:  расстояние от начала координат до точки
// y - fi:  угол поворота, вокруг вертикальной оси (от оси X против ч.с.)
// z - psi: угол наклона от горизонтальной плоскости
vector sph(vector vDsc)
{
  float ro = VectorMagnitude(vDsc);
  float fi = atan(vDsc.y/vDsc.x); // I четверть
  float psi = asin(vDsc.z/ro);

  if (vDsc.x < 0.0) fi += 180.0;      // II, III: +Pi
  else if (vDsc.y < 0.0) fi += 360.0; // IV: +2Pi, чтобы угол был положительным :)
  return Vector(ro, fi, psi);
}

// Преобразует сферические координаты в декартовы
vector dsc(vector vSph)
{
  float x = vSph.x*cos(vSph.z)*cos(vSph.y); // ro*cos(psi)*cos(fi)
  float y = vSph.x*cos(vSph.z)*sin(vSph.y); // ro*cos(psi)*sin(fi)
  float z = vSph.x*sin(vSph.z); // ro*sin(psi)
  return Vector(x, y, z);
}

vector setMagnitude(vector vVector, float fMagnitude)
{
  vector vSph = sph(vVector);
  vSph.x = fMagnitude;
  return dsc(vSph);
}

void makeTrace(
  location lSource,    // Начало трассы
  location lTarget,    // Цель
  float fJump = 0.25f// Дистанция шага между эффектами, м.
  float fSpeed = 10.0f, // Скорость "снаряда", м/с
  int nTraceVFX = VFX_FNF_SMOKE_PUFF,
  int nBurstVFX = VFX_FNF_FIREBALL) 
{
  float fInterval = fJump/fSpeed;
  effect eVis = EffectVisualEffect(nTraceVFX);

  vector vOA = GetPositionFromLocation(lSource); // вектор (OA)
  vector vOB = GetPositionFromLocation(lTarget); // вектор (OB)
  vector vAB = vOB - vOA; // вектор (AB) = (OB)-(OA)
 
  //vector vNorm = VectorNormalize(vAB); // единичный вектор, коллинеарный AB
  vector vJump = setMagnitude(vAB, fJump);
 
  vector vCurrent = vOA;
  object oArea = GetAreaFromLocation(lTarget);
  int n = FloatToInt( VectorMagnitude(vAB)/fJump );
  int i;
  float fDelay = 0.0;
  for (i=0; i < n; i++)
  {
    vCurrent += vJump;
    location lCurrent = Location(oArea, vCurrent, 0.0);
    fDelay += fInterval;
    DelayCommand(fDelay, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, lCurrent));
  }
  // Fireball VFX on target:
  if (nBurstVFX != VFX_NONE)
  {
    fDelay += fInterval;
    effect eBurst = EffectVisualEffect(nBurstVFX);
    DelayCommand(fDelay, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eBurst, lTarget));
  }
}
//void main(){}


Функции, устанавливают заданное числовое значение аляймента:
Neverwinter Script Source
void setGoodEvilValue(object oCreature, int nValue)
{
  if(!GetIsObjectValid(oCreature)||
    (GetObjectType(oCreature) != OBJECT_TYPE_CREATURE))
    return;
 
  if (nValue < 0) nValue = 0;
  else if (nValue > 100) nValue = 100;
 
  int nCurGE = GetGoodEvilValue(oCreature);
  int nShift = abs(nCurGE - nValue);
  if (nShift == 0) return;
  int nDir = (nValue > nCurGE) ? ALIGNMENT_GOOD : ALIGNMENT_EVIL;
  AdjustAlignment(oCreature, nDir, nShift);
  if (GetGoodEvilValue(oCreature) != nValue)
    setGoodEvilValue(oCreature, nValue);
}

void setLawChaosValue(object oCreature, int nValue)
{
  if(!GetIsObjectValid(oCreature)||
    (GetObjectType(oCreature) != OBJECT_TYPE_CREATURE))
    return;
 
  if (nValue < 0) nValue = 0;
  else if (nValue > 100) nValue = 100;
 
  int nCurLC = GetLawChaosValue(oCreature);
  int nShift = abs(nCurLC - nValue);
  if (nShift == 0) return;
  int nDir = (nValue > nCurLC) ? ALIGNMENT_LAWFUL : ALIGNMENT_CHAOTIC;
  AdjustAlignment(oCreature, nDir, nShift);
  if (GetLawChaosValue(oCreature) != nValue)
    setLawChaosValue(oCreature, nValue);
}
//void main(){}

Вдруг кому-нибудь пригодится.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

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

 



Текстовая версия Сейчас: 29th March 2024 - 00:57