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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
5 страниц V  « < 2 3 4 5 >  
Ответить в эту темуОткрыть новую тему
> База скриптов, Готовые скрипты. Описание обязательно.
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(){}

Вдруг кому-нибудь пригодится.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
DraX
сообщение Aug 12 2005, 11:16
Сообщение #76


Level 3
*

Класс: Паладин
Характер: Chaotic Evil
Раса: Человек



Нет проблем. Итак, вот он, скрипт:

Neverwinter Script Source
if(GetLocalInt(OBJECT_SELF, "DO_ONCE") != 1)
{
string sTag = "OBJECT"// Тэг нужного нам объекта
num nNum = 1// Начинаем считать объекты с номера 1 по нужный нам

for(nNum = 1; nNum <= 4; nNum++)  // Номер 4 - кол-во объектов
{
  int nNum2 = nNum++;

  if(nNum2 > 4)
    nNum2 = 1;

  object oStart = GetObjectByTag(sTag + "_" + nNum);
  object oEnd = GetObjectByTag(sTag + "_" + Num2);

  ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectBeam(VFX_BEAM_FIRE, oEnd, BODY_NODE_CHEST), oStart);
}

SetLocalInt(OBJECT_SELF, "DO_ONCE", 1);
}


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

ЗЫ: Сорри за опечатки
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
2_advanced
сообщение Aug 30 2005, 15:11
Сообщение #77


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

Класс: Вор
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]



альтернатива стандартному отдыху с возможностью ставить свою анимацию, выставлять время реста, проверки до/после/во время реста и т.п.

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

    int nRez = GetLocalInt(oPC, "LastEventRest"); // спим?

    DeleteLocalInt(oPC, "LastEventRest");
    DeleteLocalLocation(oPC, "RestLocation");

    if(!nRez) // не спим
        return;

    FadeFromBlack(oPC, FADE_SPEED_SLOWEST); //

    object oBedroll = GetLocalObject(oPC, "bedroll");
    if(GetIsObjectValid(oBedroll))
    {
        DestroyObject(oBedroll, 3.5f);
        CreateItemOnObject(BEDROLL_IT_RES, oPC);
        DeleteLocalObject(oPC, "bedroll");
    }
}

void RestFinish()
{
    object oPC = OBJECT_SELF;

    if(!GetLocalInt(oPC, "LastEventRest"))
        return;

    DeleteLocalInt(oPC, "NextRest");

    ActionMoveToLocation(GetLocation(oPC)); // stand up :P

//todo:сохр нужного - хп. и т.п.
    ForceRest(oPC);
//todo:восстановление

    SendMessageToPC(oPC, "<cооо>Отдых закончен..</c>");

    if(!GetLocalInt(oPC, "REST_DONT_SLEEP"))
        ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD);

    RestEnd();
}

void RestFailCheck() // check chance to rest // c:RestBegin: random(restduration)
{
    object oPC = OBJECT_SELF;
    object oArea = GetArea(oPC);

    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SLEEP), oPC);

    if(!GetLocalInt(oPC, "LastEventRest"))
        return;

    if(!GetIsObjectValid(oArea))
        return;

    object oPC2 = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC); // спокойный рест если рядом кто-то есть
    if(oPC2 != OBJECT_INVALID && !GetIsEnemy(oPC, oPC2) && GetDistanceBetween(oPC, oPC2) < 10.0)
        return;

    object oChance = GetNearestObjectByTag(REST_CHANCE_PL_TAG);
    if(oChance == OBJECT_INVALID)
        return;

    int nChance = GetLocalInt(oChance, "REST_CHANCE");

    if(!nChance || (nChance >= d100()))
        return;

    RestEnd();
}

void RestThread() // cancel rest checks :P // c:RestBegin
{
    object oPC = OBJECT_SELF;

    if(!GetLocalInt(oPC, "LastEventRest")) // уже не спим
        return;

// враждебная крича или перемещения игрока
    object oEnemy = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY);
    if( GetLocation(oPC) != GetLocalLocation(oPC, "RestLocation") ||
        (GetIsObjectValid(oEnemy) && GetDistanceBetween(oEnemy, oPC) < 15.0)   )
    {
        SendMessageToPC(oPC, "<cооо>Отдых сорван.</c>");
        RestEnd();
        return;
    }

    if(GetLocalInt(oPC, "REST_DONT_SLEEP"))
        ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE, 1.0, 3.0);
    else
        ActionPlayAnimation(ANIMATION_LOOPING_DEAD_FRONT, 1.0, 3.0);

    AssignCommand(oPC, DelayCommand(3.0f, RestThread())); // повтор
}

void NextRestTimer() // proc. 4 min. for failed rest // c:RestBegin
{
    object oPC = OBJECT_SELF;

    int nCurr = GetLocalInt(oPC, "NextRest");

    if(nCurr)
    {
        if(!GetLocalInt(oPC, "LastEventRest"))
            SetLocalInt(oPC, "NextRest", nCurr - 1);

        AssignCommand(oPC, DelayCommand(30.0, NextRestTimer())); // временной промежуток между рестами(при неудаче): 8 * 30 сек = 4 мин
    }
}

void RestBegin(float fSeconds)
{
    object oPC = OBJECT_SELF;

    ClearAllActions();

    SetLocalInt(oPC, "NextRest", 8); // временной промежуток между рестами
    SetLocalInt(oPC, "LastEventRest", 1); // рест?!
    SetLocalLocation(oPC, "RestLocation", GetLocation(oPC));

    AssignCommand(oPC, DelayCommand(30.0f, NextRestTimer()));
    AssignCommand(oPC, DelayCommand(3.0f + fSeconds, RestFinish())); // финиш
    AssignCommand(oPC, DelayCommand(3.0f, RestThread())); // проверки

    DelayCommand(3.5f, FadeToBlack(oPC, FADE_SPEED_MEDIUM));
}

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

    if(GetIsDM(oPC) || GetIsDMPossessed(oPC))
    {
        ForceRest(oPC);
        return;
    }

    object oMod = GetModule();

    if(GetLocalInt(oPC, "LastEventRest")) // рест уже запущен. игрок пытается перезапустить
    {
        AssignCommand(oPC, ClearAllActions());
       
        if(GetLocalInt(oPC, "REST_DONT_SLEEP"))
            DelayCommand(0.1f, ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE, 1.0, 3.0));
        else
            DelayCommand(0.1f, ActionPlayAnimation(ANIMATION_LOOPING_DEAD_FRONT, 1.0, 3.0));
       
        return;
    }


    int nNextRest = GetLocalInt(oPC, "NextRest");
    if(nNextRest)
    {
        AssignCommand(oPC, ClearAllActions());
        SendMessageToPC(oPC, "<cооо>Отдых возможен в течение " + IntToString(nNextRest/2) + " минут</c>");
        return;
    }


    object oChance = GetNearestObjectByTag(REST_CHANCE_PL_TAG); // неспокойность места :)
    if(oChance != OBJECT_INVALID)
    {
        int nChance = GetLocalInt(oChance, "REST_CHANCE");
        if(!nChance)
        {
            AssignCommand(oPC, ClearAllActions());
            SendMessageToPC(oPC, "<cо0о>Вы не можете отдыхать тут.</c>");
            return;
        }
    }

    switch(GetLastRestEventType())
    {
        case REST_EVENTTYPE_REST_STARTED:
            int nDelay = REST_DELAY;
            int nLastRest = GetActionLastTime(oPC, "REST");

            if(nLastRest < nDelay)
            {
                FloatingTextStringOnCreature("<cооо>Вы не устали.</c>", oPC, 0);
                SendMessageToPC(oPC, "<cо0о>Отдых возможен через " + IntToString(nDelay - nLastRest - 1) + ":" + IntToString(59-GetTimeMinute()) + " час(а) .</c>");
                AssignCommand(oPC, ClearAllActions());
                return;
            }

// проверки на наличие необходимых для отдыха итемов
            oBedroll = GetItemPossessedBy(oPC, BEDROLL_IT_RES);
            if(GetClassByPosition(1, oPC) == CLASS_TYPE_MONK || GetRacialType(oPC) == RACIAL_TYPE_ELF)
            {
                SetLocalInt(oPC, "REST_DONT_SLEEP", 1);
            }
            else
            if(GetIsObjectValid(oBedroll))
            {
                DestroyObject(oBedroll);
                oBedroll = CreateObject(OBJECT_TYPE_PLACEABLE, BEDROLL_PL_RES, GetLocation(oPC));
                SetLocalObject(oPC, "bedroll", oBedroll);
            }
            else
            {
                SendMessageToPC(oPC, "<cооо>Вам не на чем спать.</c>");
                AssignCommand(oPC, ClearAllActions());
                return;
            }

// костёр :) но тут не о нём
            object oCamp = GetNearestObjectByTag(CAMPFIRE_PL_RES, oPC);
            if(GetIsDay() || (GetIsObjectValid(oCamp) && GetDistanceBetween(oCamp, oPC) < 4.5))
                SetLocalInt(oPC, "REST_CAMPFIRE", 1);

// из 2да время отдыха
            int nRestDuration = StringToInt(Get2DAString("restduration", "DURATION", GetHitDice(oPC)));
            if(nRestDuration)
            {
                float fCheckDelay = IntToFloat(nRestDuration)/1000.0f;

                DelayCommand(0.1f, AssignCommand(oPC, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_LEFTHAND)))); // убрать все из рук
                DelayCommand(0.2f, AssignCommand(oPC, ActionUnequipItem(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND))));
                DelayCommand(0.4f, AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 2.7))); // анимация укладывания лежака
                DelayCommand(0.0f, AssignCommand(oPC, RestBegin(fCheckDelay))); // рест.начало

                DelayCommand(IntToFloat(Random(nRestDuration))/1000.0f, AssignCommand(oPC, RestFailCheck())); // ..проснуться в неспокойном месте :P
            }

            break;
    }
}

в модульный onEnter:
Neverwinter Script Source
DeleteLocalInt(oPC, "NextRest");
DeleteLocalInt(oPC, "LastEventRest");

Добавлено в 15:18
позволяет получать разницу во времени между действиями..

Neverwinter Script Source
void SetActionLastTime(object oPC, string sAction)
{
    string sPCName = GetPCPlayerName(oPC); // для уникальности.. вообще использую № персонажа

    int nHour = GetTimeHour();
    int nDay  = GetCalendarDay();
    int nMonth = GetCalendarMonth();
    int nYear = GetCalendarYear();

    string sData = IntToString(nHour) + ";" + IntToString(nDay) + ";" + IntToString(nMonth) + ";" + IntToString(nYear) + ";";

    SetLocalString(GetModule(), sAction + sPCName, sData);
}

int GetActionLastTime(object oPC, string sAction)
{
    string sPair;
    string sPCName = GetPCPlayerName(oPC);
    string sData = GetLocalString(GetModule(), sAction + sPCName);

    if(sData == "")
    {
        return 100;
    }

    int nLastMinute;
    int nLastHour;
    int nLastDay;
    int nLastMonth;
    int nLastYear;

    int i;
    for(i=0; i<5; i++)
    {
        int nPos = FindSubString(sData, ";"); // вычленение. почему в НВС нет phpшного explode? :D
        if(nPos != -1)
        {
            sPair = GetStringLeft(sData, nPos);
            sData = GetStringRight(sData, GetStringLength(sData) - 1 - nPos);

            switch(i)
            {
                case 0: nLastHour   = StringToInt(sPair); break;
                case 1: nLastDay    = StringToInt(sPair); break;
                case 2: nLastMonth  = StringToInt(sPair); break;
                case 3: nLastYear   = StringToInt(sPair); break;
            }
        }
    }

    int nMinute = GetTimeMinute();
    int nHour = GetTimeHour();
    int nDay  = GetCalendarDay();
    int nYear = GetCalendarYear();
    int nMonth = GetCalendarMonth();

    if(nLastYear != nYear)
        nMonth = nMonth + 12;

    if(nLastMonth != nMonth)
        nDay = nDay + 28 * (nYear - nLastYear);

    if(nDay != nLastDay)
        nHour = nHour + 24 * (nDay - nLastDay);

    return (nHour - nLastHour);
}


Сообщение отредактировал 2_advanced - Aug 30 2005, 15:24
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Sep 20 2005, 08:57
Сообщение #78


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

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



Скрипт запрещает классы в модуле. Годится для сингла. Для шардов надо придумать как описать РС. Ставится это добро на OnPlayerLevelUp модуля.
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: OnPlayerLevelUp  "am_mod_levelup"
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
  Скрипт запрещающий использование выборочных
  классов в модуле. Спасибо Dumbo за упрощенную
  форумулу, моя была в пять раз больше =).
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 20.09.2005
//:://////////////////////////////////////////////
void main()
{
    object oPC = GetFirstPC();
    int iHit = GetHitDice(oPC); // Берем уровень игрока
    int iXP = GetXP(oPC); // Вся ХР игрока
    string sClass; // Для сообщения игроку что он сделал неправильно
    int iClass2 = GetClassByPosition(2, oPC); // Второй класс мультикласса
    int iClass3 = GetClassByPosition(3, oPC); // Третий  класс мультикласса
    int F = CLASS_TYPE_FIGHTER; // Воин
    int R = CLASS_TYPE_ROGUE;  // Вор
    int D = CLASS_TYPE_DRUID;  // Друид
    int P = CLASS_TYPE_PALADIN; // И так далее...

    // Для примера классs: Если Воин, Вор, Друид, Паладин
    if  ((iClass2==F || iClass3==F) || (iClass2==R || iClass3==R)
      || (iClass2==D || iClass3==D) || (iClass2==P || iClass3==P))
      {
          if(iClass2==F || iClass3==F) sClass = "Воин";
          if(iClass2==R ||  iClass3==R) sClass = "Вор";
          if(iClass2==D || iClass3==D) sClass = "Друид";
          if(iClass2==P || iClass3==P) sClass = "Паладин";

        // Присвоим РС в начале ХР на уровень меньше, значит заберем один
        // уровень, что мы запретили из использования. Дальше, мы возвращаем
        // назад всю нашу ХР, ведь ХР может быть намного больше чем мы
        // потратили на поднятие уровня.
        SetXP(oPC, (iHit*(iHit-1)*500)-((iHit-1)*1000));
        DelayCommand(0.5, SetXP(oPC, iXP));

        // Можно так сообщить, можно что-то другое.
        SendMessageToPC(oPC, "Вы использовали запрещенный класс: "+sClass);

        /*
          Тут можно вписать что-нибудь из эффектов, для острастки.
        */

      }
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
2_advanced
сообщение Oct 26 2005, 19:42
Сообщение #79


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

Класс: Вор
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]



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

зы. необходим неразрушимый невидимый объект sittingsurface
Neverwinter Script Source
void main()
{
    object oPC = GetLastUsedBy();
    object oChair = OBJECT_SELF;

    if(GetIsObjectValid(oChair) && GetIsObjectValid(oPC))
    {
        object oSurf = GetLocalObject(oChair, "surf");

        if(GetIsObjectValid(oSurf))
        {
            object oSitter = GetSittingCreature(oSurf);

            if(!GetIsObjectValid(oSitter) || GetArea(oSitter) != GetArea(oChair))
                DestroyObject(oSurf);
            else
                return;
        }

        vector vSurf = GetPosition(oChair);
        vSurf.z = 0.0;

        location lSurf = Location(GetArea(oChair), vSurf, GetFacing(oChair));

        object oNewSurf = CreateObject(OBJECT_TYPE_PLACEABLE, "sittingsurface", lSurf, FALSE);

        SetLocalObject(oChair, "surf", oNewSurf);

        AssignCommand(oPC, ActionSit(oNewSurf));
    }
}
для доработки: выкидывать игрока с *объекта посадки* при уничтожении стула, профиксить баг с высотой посадки для разных расс (было такое на 1.29 о_О), сделать возможным усаживаться нескольким персонажам на 1 большой объект (диван =)) с автораспределением свободных сидячих мест.
<сделаю позже :swoon: >
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Nov 2 2005, 00:18
Сообщение #80


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

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



Скрипт вешается на строку диалога НПС. Если он загородил нам проход, просим отойти в сторону. Очень актуально для сингла. Когда НПС стоит поперек выхода и нет сил его обойти...
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: ActionTaken  am_at_npc_step
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
  NPC уходит на точку рандомную точку, освобождая
  игроку проход в локации. Использует функцию
  генерирования рандомной локации.
*/

//:://///////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 01.10.2005
//:://///////////////////////////////////////////
//:: CreateRandomLocation Function by Baal
//:://///////////////////////////////////////////
location CreateRandomLocation(object oTarget, float fRadius, int bOnLine = TRUE)
{
if(!bOnLine)
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 lNEW=Location(GetArea(oTarget),Vector(iXO+fRadius*cos(fRndomAngle),iYO+fRadius*sin(fRndomAngle)),360.0);
return lNEW;
}
//:://///////////////////////////////////////////

void main()
{
    object oPC = GetPCSpeaker(); // Игрок
    object oSelf = OBJECT_SELF; // НПС с которым идет диалог
    location lFree = CreateRandomLocation(oSelf, 5.0);
    // Генерим случайную точку в радиусе 5 метров
    int iRun = FALSE; // Параметр определяющий скорость НПС

    if(GetLocalInt(oSelf, "RUN"))
      {
        iRun = TRUE; // Если присвоить локалку "RUN" на НПС, то он побежит.
      }
    AssignCommand(oSelf, ClearAllActions()); // Почистим стек команд
    AssignCommand(oSelf, ActionMoveToLocation(lFree, iRun));
    // Использую ActionMove, что бы НПС не переместился в "мертвую" точку без прохода.
    AssignCommand(oSelf, ActionDoCommand(SetFacingPoint(GetPosition(oPC))));
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Nov 8 2005, 15:13
Сообщение #81


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

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



Скрипт активирует на локации енкаучеры ночные и дневные. Соответсвенно одни выключает, другие включает. Все работает как часы и оптимизировано Лексом. За шо ему гранд респект. :good:
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: OnEnter  am_ahb_day_night
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
  Скрипт локаций День/Ночь. Запускает OnUserDefined
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Edit By: Lex
//:: Created On: 24.05.2005
//:://///////////////////////////////////////////
//#include "am_inc_common"
void main()
{
object oPC = GetFirstPC();
if (GetArea(oPC) != OBJECT_SELF) return;

if (GetIsDusk()||GetIsNight())
    {
    if (GetLocalInt(OBJECT_SELF, "Night") != 1)
        {
        SetLocalInt(OBJECT_SELF, "Day", 0);
        SetLocalInt(OBJECT_SELF, "Night", 1);
        SignalEvent(OBJECT_SELF, EventUserDefined(3000));
        return;
        }
    else return;
    }
if (GetIsDawn()||GetIsDay())
    {
    if (GetLocalInt(OBJECT_SELF, "Day") != 1)
        {
        SetLocalInt(OBJECT_SELF, "Night", 0);
        SetLocalInt(OBJECT_SELF, "Day", 1);
        SignalEvent(OBJECT_SELF, EventUserDefined(1000));
        return;
        }
    else return;
    }
}


Neverwinter Script Source
//:://////////////////////////////////////////////
//:: ActionTaken  lm_aud_enc_activ
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
    Активирует енкаучеры. Дневные и ночные.
  LocalInt(oEnc, "ENCOUNTER_SPAWN_NIGHT") - ночные.
  LocalInt(oEnc, "ENCOUNTER_SPAWN_DAY") - дневные.
*/

//:://///////////////////////////////////////////
//:: Created By: Lex
//:: Created On: 08.11.2005
//:://///////////////////////////////////////////

void EncounterController(int ActivateStatus, object oArea = OBJECT_SELF)
{
int nEN = GetLocalInt(oArea,"ENCOUNTERS");
object oEncounter;
while (nEN > 0)
    {
    oEncounter = GetLocalObject(oArea,"ENCOUNTER_"+IntToString(nEN));
    if(GetLocalInt(oEncounter, "ENCOUNTER_SPAWN_NIGHT"))
        SetEncounterActive(!ActivateStatus, oEncounter);
    else  if(GetLocalInt(oEncounter, "ENCOUNTER_SPAWN_DAY"))
        SetEncounterActive(ActivateStatus, oEncounter);
    nEN--;
    }
}

void main()
{
  int nEvent = GetUserDefinedEventNumber();
  int ActivateStatus;
  int nEN = GetLocalInt(OBJECT_SELF,"ENCOUNTERS");
  if (nEN == 0)
      {
      object oEnc = GetFirstObjectInArea(OBJECT_SELF);
      while (GetIsObjectValid(oEnc))
          {
            if(GetObjectType(oEnc) == OBJECT_TYPE_ENCOUNTER)
                {
                nEN++;
                SetLocalObject(OBJECT_SELF,"ENCOUNTER_"+IntToString(nEN),oEnc);
                }
            oEnc = GetNextObjectInArea(OBJECT_SELF);
          }
      if (nEN == 0) nEN = -1;
      SetLocalInt(OBJECT_SELF,"ENCOUNTERS",nEN);
      }
if (nEvent == 1000) // День
  {
  if (nEN == -1) return;
  EncounterController(TRUE);
  return;
  }
if (nEvent == 3000) // Ночь
  {
  if (nEN == -1) return;
  EncounterController(FALSE);
  return;
  }
}

Добавлено в [mergetime]1131452068[/mergetime]
А, забыл! :scratch: Первый на хертбит арены. Второй на юзерДеф ей же.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Aiwan
сообщение Nov 14 2005, 14:45
Сообщение #82


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

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



Выкладываю скрипт+заготовку ERF триггера, что бы вы не мучались с настройкой. Давно я использую на триггерах три своих темповых скрипта, для присвоения каких-нибудь локалок на игрока, для проверки того или иного диалога, строки, действия и прочее. Очень меня задолбало это. Писать каждый раз новый скрипт и я написал триггер для теста. Что он делает? Он присваивает до 5 уникальных локалок на игрока и НПС, может отправить НПС в точку которую вы укажите. Например, НПС в другой локе, вы наступили на триггер, он спавнился рядом и повесили на него три локалки, повесили на РС две локалки и можно быть в середине вашего сюжета. Еще он (скрипт) может запускать другие скрипты на НПС, РС и OBJECT_SEL, соответсвенно.

Как он настраивается:
DEACTIVATED == 1 отключает триггер после первого раза. Например, вы насупили раз, прошли одну ветку диалога. Подошли, наступили второй, прошли заново диалог и т.д. Надо? Ставьте 0 и будет бесконечно приваивать ваши локалки.
LOCAL_NPC_01 - Присваивает переменную на НПС. Пример: ПЕРЕМЕННАЯ_01
Neverwinter Script Source
SetLocalInt(oNPC, "ПЕРЕМЕННАЯ", 1);
SetLocalInt(oNPC, "ДРУГАЯ_ПЕРЕМЕННАЯ", 2);

LOCAL_PC_01 - Присваивает переменную на PС. Пример: ПЕРЕМЕННАЯ_01
Neverwinter Script Source
SetLocalInt(oPC, "ПЕРЕМЕННАЯ", 1);
SetLocalInt(oPC, "ДРУГАЯ_ПЕРЕМЕННАЯ", 5);

RUN_SCRIPT - ИМЯ_СКРИПТА - запускает на OBJECT_SELF
Neverwinter Script Source
ExecuteScript("ИМЯ_СКРИПТА", OBJECT_SELF);

RUN_SCRIPT_ON_NPC - ИМЯ_СКРИПТА - запускает на oNpc
Neverwinter Script Source
ExecuteScript("ИМЯ_СКРИПТА", oNpc);

На игрока понятное дело так же.
TAG_NPC - Таг нашего НПС.
TAG_WP_TO_JUMP - ТАГ нашего вейпоинта. НПС прыгнет на него, если только вы укажете ТАГ точки.
Ну вот и все. Все локалки работают до пяти штук на РС и НПС.

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: OnEnter  am_ten_test
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
    ТЕСТОВЫЙ СКРИПТ ДЛЯ ПРИСВОЕНИЯ ПЕРЕМЕННЫХ
*/

//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 11.11.2005
//:://////////////////////////////////////////////
//#include "sz_inc_common"
#include "am_inc_debug"

void main()
{
object oPC = GetEnteringObject(); // PC
object oSelf = OBJECT_SELF;
string sNpc = GetLocalString(oSelf, "TAG_NPC");
string sWp = GetLocalString(oSelf, "TAG_WP_TO_JUMP");
object oNpc = GetObjectByTag(sNpc);
object oWp = GetWaypointByTag(sWp);

if(GetLocalInt(oSelf, "DEACTIVATED")==2)
  return;
/*
//------------------------------------------------------------------------------
  Заккоментированные строки работают с библиотекой SlavaZ-а, на которой
  построены многие квесты наших модулей.

//------------------------------ КВЕСТ #1 --------------------------------------
string sQ1 = GetLocalString(oSelf, "QUEST_01");
string sQuest1 = GetStringLeft(sQ1, GetStringLength(sQ1)-3);
int iQ1 = StringToInt(GetStringRight(sQ1, 2));
//------------------------------ КВЕСТ #2 --------------------------------------
string sQ2 = GetLocalString(oSelf, "QUEST_02");
string sQuest2 = GetStringLeft(sQ2, GetStringLength(sQ2)-3);
int iQ2 = StringToInt(GetStringRight(sQ2, 2));
//------------------------------ КВЕСТ #3 --------------------------------------
string sQ3 = GetLocalString(oSelf, "QUEST_03");
string sQuest3 = GetStringLeft(sQ3, GetStringLength(sQ3)-3);
int iQ3 = StringToInt(GetStringRight(sQ3, 2));
//------------------------------ КВЕСТ #4 --------------------------------------
string sQ4 = GetLocalString(oSelf, "QUEST_04");
string sQuest4 = GetStringLeft(sQ4, GetStringLength(sQ4)-3);
int iQ4 = StringToInt(GetStringRight(sQ4, 2));
//------------------------------ КВЕСТ #5 --------------------------------------
string sQ5 = GetLocalString(oSelf, "QUEST_05");
string sQuest5 = GetStringLeft(sQ5, GetStringLength(sQ5)-3);
int iQ5 = StringToInt(GetStringRight(sQ5, 2));

  if(sQ1!=""){
  SetQuestStatus(sQuest1, iQ1, TRUE);
  Debug("Установим переменную QUEST: "+sQuest1+" == "+IntToString(iQ1));}
  if(sQ2!=""){
  SetQuestStatus(sQuest2, iQ2, TRUE);
  Debug("Установим переменную QUEST: "+sQuest2+" == "+IntToString(iQ2));}
  if(sQ3!=""){
  SetQuestStatus(sQuest3, iQ3, TRUE);
  Debug("Установим переменную QUEST: "+sQuest3+" == "+IntToString(iQ3));}
  if(sQ4!=""){
  SetQuestStatus(sQuest4, iQ4, TRUE);
  Debug("Установим переменную QUEST: "+sQuest4+" == "+IntToString(iQ4));}
  if(sQ5!=""){
  SetQuestStatus(sQuest5, iQ5, TRUE);
  Debug("Установим переменную QUEST: "+sQuest5+" == "+IntToString(iQ5));}
*/

//------------------------------------------------------------------------------
//                  Эти переменные вешаются на игрока
//------------------------------------------------------------------------------

//--------------------------- ПЕРЕМЕННАЯ #1 ------------------------------------
string sL1 = GetLocalString(oSelf, "LOCAL_PC_01");
string sLocal1 = GetStringLeft(sL1, GetStringLength(sL1)-3);
int iL1 = StringToInt(GetStringRight(sL1, 2));
//--------------------------- ПЕРЕМЕННАЯ #2 ------------------------------------
string sL2 = GetLocalString(oSelf, "LOCAL_PC_02");
string sLocal2 = GetStringLeft(sL2, GetStringLength(sL2)-3);
int iL2 = StringToInt(GetStringRight(sL2, 2));
//--------------------------- ПЕРЕМЕННАЯ #3 ------------------------------------
string sL3 = GetLocalString(oSelf, "LOCAL_PC_03");
string sLocal3 = GetStringLeft(sL3, GetStringLength(sL3)-3);
int iL3 = StringToInt(GetStringRight(sL3, 2));
//--------------------------- ПЕРЕМЕННАЯ #4 ------------------------------------
string sL4 = GetLocalString(oSelf, "LOCAL_PC_04");
string sLocal4 = GetStringLeft(sL4, GetStringLength(sL4)-3);
int iL4 = StringToInt(GetStringRight(sL4, 2));
//--------------------------- ПЕРЕМЕННАЯ #5 ------------------------------------
string sL5 = GetLocalString(oSelf, "LOCAL_PC_05");
string sLocal5 = GetStringLeft(sL5, GetStringLength(sL5)-3);
int iL5 = StringToInt(GetStringRight(sL5, 2));

  if(sL1!=""){
  SetLocalInt(oPC, sLocal1, iL1);
  Debug("Установим переменную на РС LocalInt: "+sLocal1+" == "+IntToString(iL1));}
  if(sL2!=""){
  SetLocalInt(oPC, sLocal2, iL2);
  Debug("Установим переменную на РС LocalInt: "+sLocal2+" == "+IntToString(iL2));}
  if(sL3!=""){
  SetLocalInt(oPC, sLocal3, iL3);
  Debug("Установим переменную на РС LocalInt: "+sLocal3+" == "+IntToString(iL3));}
  if(sL4!=""){
  SetLocalInt(oPC, sLocal4, iL4);
  Debug("Установим переменную на РС LocalInt: "+sLocal4+" == "+IntToString(iL4));}
  if(sL5!=""){
  SetLocalInt(oPC, sLocal5, iL5);
  Debug("Установим переменную на РС LocalInt: "+sLocal5+" == "+IntToString(iL5));}

//------------------------------------------------------------------------------
//                  Эти переменные вешаются на НПС
//------------------------------------------------------------------------------

//--------------------------- ПЕРЕМЕННАЯ #1 ------------------------------------
string sLn1 = GetLocalString(oSelf, "LOCAL_NPC_01");
string sLocalN1 = GetStringLeft(sLn1, GetStringLength(sLn1)-3);
int iLn1 = StringToInt(GetStringRight(sLn1, 2));
//--------------------------- ПЕРЕМЕННАЯ #2 ------------------------------------
string sLn2 = GetLocalString(oSelf, "LOCAL_NPC_02");
string sLocalN2 = GetStringLeft(sLn2, GetStringLength(sLn2)-3);
int iLn2 = StringToInt(GetStringRight(sLn2, 2));
//--------------------------- ПЕРЕМЕННАЯ #3 ------------------------------------
string sLn3 = GetLocalString(oSelf, "LOCAL_NPC_03");
string sLocalN3 = GetStringLeft(sLn3, GetStringLength(sLn3)-3);
int iLn3 = StringToInt(GetStringRight(sLn3, 2));
//--------------------------- ПЕРЕМЕННАЯ #4 ------------------------------------
string sLn4 = GetLocalString(oSelf, "LOCAL_NPC_04");
string sLocalN4 = GetStringLeft(sLn4, GetStringLength(sLn4)-3);
int iLn4 = StringToInt(GetStringRight(sLn4, 2));
//--------------------------- ПЕРЕМЕННАЯ #5 ------------------------------------
string sLn5 = GetLocalString(oSelf, "LOCAL_NPC_05");
string sLocalN5 = GetStringLeft(sLn5, GetStringLength(sLn5)-3);
int iLn5 = StringToInt(GetStringRight(sLn5, 2));

  if(sLn1!=""){
  SetLocalInt(oNpc, sLocalN1, iLn1);
  Debug("Установим переменную на "+GetName(oNpc)+" LocalInt: "+sLocalN1+" == "+IntToString(iLn1));}
  if(sLn2!=""){
  SetLocalInt(oNpc, sLocalN2, iLn2);
  Debug("Установим переменную на "+GetName(oNpc)+" LocalInt: "+sLocalN2+" == "+IntToString(iLn2));}
  if(sLn3!=""){
  SetLocalInt(oNpc, sLocalN3, iLn3);
  Debug("Установим переменную на "+GetName(oNpc)+" LocalInt: "+sLocalN3+" == "+IntToString(iLn3));}
  if(sLn4!=""){
  SetLocalInt(oNpc, sLocalN4, iLn4);
  Debug("Установим переменную на "+GetName(oNpc)+" LocalInt: "+sLocalN4+" == "+IntToString(iLn4));}
  if(sLn5!=""){
  SetLocalInt(oNpc, sLocalN5, iLn5);
  Debug("Установим переменную на "+GetName(oNpc)+" LocalInt: "+sLocalN5+" == "+IntToString(iLn5));}
//------------------------------------------------------------------------------
// Тут мы определяем нашего НПС. Отправляем его на вейпоинт, енсли нужно.
//------------------------------------------------------------------------------
  if(sNpc!="" && !GetIsObjectValid(oNpc))
    {
      Debug("ОШИБКА! Вашего НПС не существует!");
    }
  if(sWp!="")
  {
      if(!GetIsObjectValid(oWp))
        {
          Debug("ОШИБКА! Неправильный ТАГ вейпоинта!");
          return;
        }
      AssignCommand(oNpc, ClearAllActions());
      AssignCommand(oNpc, JumpToObject(oWp));
  }
//------------------------------------------------------------------------------
//  Тут мы запускаем нужные скрипты на игрока, НПС или просто на сам триггер.
//------------------------------------------------------------------------------
string sScOnPC = GetLocalString(oSelf, "RUN_SCRIPT_ON_PC");
string sScOnNpc = GetLocalString(oSelf, "RUN_SCRIPT_ON_NPC");
string sScOnSelf = GetLocalString(oSelf, "RUN_SCRIPT");

if(sScOnPC!="")
{
  ExecuteScript(sScOnPC, oPC);
  Debug("Запущен скрипт "+sScOnPC+" на РС");
}
if(sScOnNpc!="")
{
  ExecuteScript(sScOnNpc, oNpc);
  Debug("Запущен скрипт "+sScOnNpc+" на "+GetName(oNpc));
}
if(sScOnSelf!="")
{
  ExecuteScript(sScOnSelf, oSelf);
  Debug("Запущен скрипт "+sScOnSelf+" на OBJECT_SELF");
}
//------------------------------------------------------------------------------
//                Параметры, определяют работу триггера.
//------------------------------------------------------------------------------
if(GetLocalInt(oSelf, "DEACTIVATED")==1)
  SetLocalInt(oSelf, "DEACTIVATED", 2);
}


http://www.wrg.ru/TEMP/Aiwan/am_tr_test.erf.rar

Прикрепленные файлы
Прикрепленный файл  tr_test.jpg ( 55.35 килобайт ) Кол-во скачиваний: 6
 
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
-fenix-
сообщение Nov 16 2005, 14:10
Сообщение #83


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

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



Вот тут решил написать скрипты, которые может кому, пригодятся, но лично мне они пока не нужны. Зачем написал? Просто так. :crazy:

Что эти скрипты делают?
Они дают процент экспы за убийство/разрушение объекта равное проценту нанесенного ущерба.
Пример:
Есть бочка, у нее 10 хитов.
За разрушение назначено 100 опыта.
Если вы снимите 100% хитов(10), то получите 100% опыта(100).
Если вы снимете 50% хитов(5), то получите 50% опыта(50). Остальной опыт либо пропадет (если кроме вас объект лупили только НПС), либо поделится между другими ПС лупившими объект, либо поделится между всеми ПС и часть пропадет, от лупивших НПС.
ХМ, надеюсь, идея ясна.
Приступим к скриптам.
Для реализации нам нужно два скрипта: один на OnDamaged объекта, другой на OnDeath объекта. Скрипты универсальные и ограничений по атакующим у них нет. Дома я проверил, как смог, но так как шарда у меня дома нет, то данный аспект проверить не смог. Но по идее все работает нормально, если заметите баг, обязательно сообщите. Еще, на шарде ни когда не играл, поэтому может это и не идеальный код для него, но думаю, что знающим людям поправить будет не сложно. :)
И так, сами скрипты.


На OnDamaged объекта

Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Created By: -fenix-
//:: Created On: 16.11.2005
//:://////////////////////////////////////////////

void main()
{
object oDamager = GetLastDamager();
int iMaxHit = GetMaxHitPoints();
int iCurHit = GetCurrentHitPoints();
string sNamePC = GetName(oDamager);
int i,Z, iDamage;

if(GetIsPC(oDamager))//если атакующий ПС
{
    //индекс, по каторому будут отличаться все переменные нужные
    for(i = 1; i <= GetLocalInt(OBJECT_SELF, "KOLICHESTVO"); i ++)
    {
        //если такое имя уже есть
        if(sNamePC == GetLocalString(OBJECT_SELF, "NAME_PC_" + IntToString(i)))
        {
            //сколько всего было нанесено ущерба(включая только что нанесенный удар)
            if(iCurHit < 0)
            {
                iDamage = iMaxHit;
            }
            else
            {
                iDamage = iMaxHit - iCurHit;
            }
            //запоминаем кол-во нанесенного ущерба данным ПС
            SetLocalInt(OBJECT_SELF, IntToString(i) + "_DamagePC", (iDamage - GetLocalInt(OBJECT_SELF, "DamageAll")) + GetLocalInt(OBJECT_SELF, IntToString(i) + "_DamagePC"));
            //запоминаем общий ущерб
            SetLocalInt(OBJECT_SELF, "DamageAll", GetLocalInt(OBJECT_SELF, "DamageAll") + (iDamage - GetLocalInt(OBJECT_SELF, "DamageAll")));
            //это для проверки. Можете удалить, можете оставить и потестить
            SendMessageToPC(oDamager, GetLocalString(OBJECT_SELF, "NAME_PC_" + IntToString(i)) + "_нанес1_" + IntToString(GetLocalInt(OBJECT_SELF, IntToString(i) + "_DamagePC")));
            //это для проверки. Можете удалить, можете оставить и потестить
            SendMessageToPC(oDamager, "DamageAll1="
            IntToString(GetLocalInt(OBJECT_SELF, "DamageAll")));
            Z = 1;// чтобы знать, был такой ПС или нет
        }
    }
    //новый ПС
    if(Z != 1)
    {
        //сколько всего было нанесено ущерба(включая только что нанесенный удар)
        if(iCurHit < 0)
        {
            iDamage = iMaxHit;
        }
        else
        {
            iDamage = iMaxHit - iCurHit;
        }
        //добавляем его к "старым" ПС
        SetLocalInt(OBJECT_SELF, "KOLICHESTVO", GetLocalInt(OBJECT_SELF, "KOLICHESTVO") + 1);
        //запоминаем его имя
        SetLocalString(OBJECT_SELF, "NAME_PC_" +
IntToString(GetLocalInt(OBJECT_SELF, "KOLICHESTVO")), sNamePC);
        //запоминаем кол-во нанесенного ущерба данным ПС
        SetLocalInt(OBJECT_SELF, IntToString(GetLocalInt(OBJECT_SELF
"KOLICHESTVO")) + "_DamagePC", (iDamage - GetLocalInt(OBJECT_SELF"DamageAll")));
        //запоминаем общий ущерб
        SetLocalInt(OBJECT_SELF, "DamageAll", GetLocalInt(OBJECT_SELF,
"DamageAll") + GetLocalInt(OBJECT_SELF,
      IntToString(GetLocalInt(OBJECT_SELF, "KOLICHESTVO")) + "_DamagePC"));

/*это для проверки. Можете удалить, можете оставить и потестить*/                     
SendMessageToPC(oDamager,GetLocalString(OBJECT_SELF,"NAME_PC_"+IntToString(GetLocalInt(OBJECT_SELF,"KOLICHESTVO")))
+"_нанес2_"+IntToString(GetLocalInt(OBJECT_SELF,IntToString(GetLocalInt(OBJECT_SELF,"KOLICHESTVO"))+"_DamagePC")));
        //это для проверки. Можете удалить, можете оставить и потестить
        SendMessageToPC(oDamager, "DamageAll2=" + IntToString(GetLocalInt(OBJECT_SELF, "DamageAll")));
    }
}
else//если атакующий не ПС
{
    //сколько всего было нанесено ущерба(включая только что нанесенный удар)
    if(iCurHit < 0)
    {
        iDamage = iMaxHit;
    }
    else
    {
        iDamage = iMaxHit - iCurHit;
    }
    //запоминаем общий ущерб
    SetLocalInt(OBJECT_SELF, "DamageAll", (iDamage - GetLocalInt(OBJECT_SELF,       
    "DamageAll")) + GetLocalInt(OBJECT_SELF, "DamageAll"));
    //это для проверки. Можете удалить, можете оставить и потестить
    SendMessageToPC(GetFirstPC(), "Общий ущерб_" +         
    IntToString(GetLocalInt(OBJECT_SELF, "DamageAll")));
}
}


Второй скрипт ставется на OnDeath объекта. Этот скрипт раздает опыт.
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Created By: -fenix-
//:: Created On: 16.11.2005
//:://////////////////////////////////////////////

void main()
{
int iMaxHit = GetMaxHitPoints();
int iMaxXP = 100;//тут указываем кол-во опыта за уничтожение объекта
int i, S, iXPPC;

//сколько всего ПС атаковало объект
for(i = 1; i <= GetLocalInt(OBJECT_SELF, "KOLICHESTVO"); i ++)
{
    object oPC = GetFirstPC();

    while(S != 100)
    {
        string sNamePC = GetName(oPC);
        //если мя совпадает
        if(sNamePC == GetLocalString(OBJECT_SELF, "NAME_PC_" + IntToString(i)))
        {
          //считаем кол-во опыта
          iXPPC=((100 * GetLocalInt(OBJECT_SELF, IntToString(i) + "_DamagePC") / iMaxHit) * iMaxXP) / 100;
            //если получается меньше одного, то округляем до 1
            if(iXPPC <1)
            {
                iXPPC = 1;
            }
            GiveXPToCreature(oPC, iXPPC);//даем опыт
            S = 100;
        }
        oPC = GetNextPC();
    }
    S = 0;
}
}

Ну и еще их маленький брат - скрипт считающий отдельно урон ПС и урон всех остальных. Иногда бывает очень нужно узнать урон нанесенный объекту ПС. Скрипт для сингла.
Neverwinter Script Source
//:://////////////////////////////////////////////
//:: Created By: -fenix-
//:: Created On: 20.10.2005
//:://////////////////////////////////////////////

void main()
{
object oPC = GetLastDamager();
int iMaxHit = GetMaxHitPoints();
int iCurHit = GetCurrentHitPoints();


if(GetIsPC(oPC))
{
    int i, j;

    for(i = 1; i = j; i ++)
    {
        if(GetName(oPC) == GetLocalString(OBJECT_SELF, IntToString(i)))
        {
            int iDamage = iMaxHit - iCurHit;

            SetLocalInt(OBJECT_SELF, "DamagePC", (iDamage - GetLocalInt(OBJECT_SELF, "DamageOther") - GetLocalInt(OBJECT_SELF, "DamagePC")) + GetLocalInt(OBJECT_SELF, "DamagePC"));
            SendMessageToPC(oPC, IntToString(GetLocalInt(OBJECT_SELF, "DamagePC")));
        }
        else
        {
            SetLocalString(OBJECT_SELF, IntToString(i + 1), GetName(oPC));
            j = j + 1;
        }
    }
}
else
{
    int iDamage = iMaxHit - iCurHit;

    SetLocalInt(OBJECT_SELF, "DamageOther", (iDamage - GetLocalInt(OBJECT_SELF, "DamagePC") - GetLocalInt(OBJECT_SELF, "DamageOther")) + GetLocalInt(OBJECT_SELF, "DamageOther"));
    SendMessageToPC(oPC, IntToString(GetLocalInt(OBJECT_SELF, "DamageOther")));
}
}


З.Ы Сорри, что порвал страницу :oops:
Aiwan: вообще-то некоторые строки можно делить и переносить. :this:
-fenix-: просто мне как-то неудобно так ориентироваться %)
Но впредь, на форуме, буду строки делить и переносить:yes:


Сообщение отредактировал -fenix- - Nov 17 2005, 13:09
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Dec 7 2005, 21:11
Сообщение #84


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

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



Neverwinter Script Source
//::============================================================================
//::    L&A Script Systems - TEXT COLORS  (TS)
//::============================================================================
string sASCII = "#####################################$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ЂЃ‚ѓ„…†‡?‰Љ‹ЊЌЋЏђ‘’“”•--?™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя";

//:: COLOR CONSTANTS
const string TC_DARK_GRAY = "<c°°°>";
const string TC_GRAY = "<c¦¦¦>";
const string TC_DARK_CYAN = "<c ¦¦>";
const string TC_DARK_MAGENTA = "<c¦ ¦>";
const string TC_DARK_YELLOW = "<c¦¦ >";
const string TC_DARK_RED = "<c¦  >";
const string TC_DARK_GREEN = "<c ¦ >";
const string TC_DARK_BLUE = "<c  ¦>";
const string TC_NONE = ""; // Default (no color)
const string TC_END = "</c>"; // (color end TAG)
const string TC_DEFAULT = TXT_COLOR_NONE;
const string TC_WHITE = "<cяяя>"; // White
const string TC_CYAN = "<c яя>"; // Light Cyan
const string TC_MAGENTA = "<cя я>"; // Magenta
const string TC_YELLOW = "<cяя >"; // Yellow
const string TC_RED = "<cя  >"; // Red
const string TC_GREEN = "<c я >"; // Green
const string TC_BLUE = "<c  я>"; // Blue


// Используйте числа более 35 (там системные знаки, они заменены на #)
string TC_GetASCIIChar(int nByte);
// меняет цвет текста на соответствующий 3 параметрам:
// Red   - красный
// Green - зеленый
// Blue  - синий
// цвет стандарта RGB
string TC_ColorTextRGB(string sText, int nRed, int nGreen, int nBlue);
// меняет цвет текста на соответствующий константе
string TC_ColorText(string sText, string sColor);

//::============================================================================
string TC_GetASCIIChar(int nByte)
{
return GetSubString(sASCII, nByte, 1);
}
//::============================================================================
string TC_ColorTextRGB(string sText, int nRed, int nGreen, int nBlue)
{
string sResult = "<c" + TC_GetASCIIChar(nRed) + TC_GetASCIIChar(nGreen) + TC_GetASCIIChar(nBlue) + ">" + sText + TC_END;
return sResult;
}
//::============================================================================
string TC_ColorText(string sText, string sColor)
{
string sResult = sColor + sText + TC_END;
return sResult;
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
justshurik
сообщение Feb 4 2006, 00:48
Сообщение #85


Level 4
**

Класс: Маг
Характер: Chaotic Evil
Раса: Человек



Скрипт мой, все совпадения с другими скриптами случайны.
Скрипт для управления группой NPC в реальном времени, без создания waypoint-ов. Позволяет группировать NPC в любые построения(к примеру в Каре, Свинью, Шеренгу,Полк и т д.и т п на Ваш вкус) и перемещать их в таком построении. Можно использовать при построении масштабных баталий с участием большого количества неписей(причем под управлением игрока)
CODE

location Preobr(vector a, object oArea);
vector Arifm(vector a,vector b,int flag=0);
float ABSVect(vector a);
vector Proizv(vector a, float n);
vector Ort(vector a);
vector Perpend(vector a);
location Loc(float a,float b, object oArea,object oPC,location CastSpell);
void Go(object NPC, location CastSpell,object oPC,object oArea,float a,float b );
////////////////////////////////////////////////////////////////////////////////
void main()
{
object oPC=GetItemActivator();
object oItem =GetItemActivated();
object oArea=GetObjectByTag("arena");
object oNPC1=GetObjectByTag("NPC1");
object oNPC2=GetObjectByTag("NPC2");
object oNPC3=GetObjectByTag("NPC3");
object oNPC4=GetObjectByTag("NPC4");
object oNPC5=GetObjectByTag("NPC5");
object oNPC6=GetObjectByTag("NPC6");
object oNPC7=GetObjectByTag("NPC7");

if("panel"==GetTag(oItem))
{
location lTarget=GetItemActivatedTargetLocation();
AssignCommand(oNPC1,ClearAllActions());
Go(oNPC1,lTarget,oPC,oArea,1.0,1.0);
//                         a     b
AssignCommand(oNPC2,ClearAllActions());
Go(oNPC2,lTarget,oPC,oArea,1.0,-1.0);
//                         a      b
AssignCommand(oNPC3,ClearAllActions());
Go(oNPC3,lTarget,oPC,oArea,5.0,5.0);
//                         a      b
AssignCommand(oNPC4,ClearAllActions());
Go(oNPC4,lTarget,oPC,oArea,5.0,-5.0);
//                         a     b
AssignCommand(oNPC5,ClearAllActions());
Go(oNPC5,lTarget,oPC,oArea,10.0,10.0);
//                         a     b
AssignCommand(oNPC6,ClearAllActions());
Go(oNPC6,lTarget,oPC,oArea,10.0,-10.0);
//                         a      b
AssignCommand(oNPC7,ClearAllActions());
Go(oNPC7,lTarget,oPC,oArea,5.0,0.0);
}; //                      a    b
}


/*******************************************************************************/
//preobrazovanie vector -> location

location Preobr(vector a, object oArea)
{
location Loc1=Location(oArea,a,GetFacing(oArea));
return Loc1;
}

//slogenie i vichitanie vectorov a i b

vector Arifm(vector a,vector b,int flag=0)
{
float ax,ay,az,bx,by,bz;
ax=a.x;
ay=a.y;
az=a.z;
bx=b.x;
by=b.y;
bz=b.z;
if(flag==0)
{
vector Res1=Vector(ax+bx,ay+by,az+bz);
return Res1;
}
else
{
vector Res2=Vector(bx-ax,by-ay,bz-az);
return Res2;
};
}

//ABS vectora
float ABSVect(vector a)
{
float Mod=sqrt((a.x*a.x)+(a.y*a.y)+(a.z*a.z));
return Mod;
}

//umnogenie vectora na skalyar

vector Proizv(vector a, float n)
{
vector Res=Vector(n*a.x,n*a.y,a.z);
return Res;
}

//Ortonormirovka vectora

vector Ort(vector a)
{
float Mod=ABSVect( a);
vector Res=Vector(a.x/Mod,a.y/Mod,a.z/Mod);
return Res;
}

//perpendikulyar k vectoru

vector Perpend(vector a)
{
vector Res=Vector((-1.0)*a.y,a.x,a.z);
return Res;
}

//osnovnaya funkciya

location Loc(float a,float b, object oArea,object oPC,location CastSpell)
{
vector vPC=GetPosition(oPC);

vector vCastSpell=GetPositionFromLocation(CastSpell);

vector vLocal1=Arifm(vPC,vCastSpell,2);

vector vLocal = Ort(vLocal1);

vector Dop=Proizv(vLocal,a);

vector vDop=Arifm(vLocal1,Dop);

vector vGlobalDop=Arifm(vDop,vPC);

vector vPerpendik=Perpend(vDop);

vector vOrt= Ort(vPerpendik);

vector vLocalRes= Proizv(vOrt,b );

vector vGlobalRes=Arifm(vLocalRes,vGlobalDop);

location Result2=Preobr(vGlobalRes,oArea);

return Result2;
}

void Go(object oNPC, location CastSpell,object oPC,object oArea,float a,float b )
{
CastSpell=GetItemActivatedTargetLocation();
location lTarget=Loc(a,b,oArea,oPC,CastSpell);
AssignCommand(oNPC,ActionMoveToLocation(lTarget,TRUE));
}

Построение можно регулировать с помощью двух параметров a и b. a отвечает за то как удален будет NPC от игрока, а b - за смещение NPC вправо или влево.

Для использования необходимо:
1) Создать предмет со свойством "активировать предмет:дальнее расстояние" и тагом "panel"
2)Поставить группу из семи NPC с тагоми:NPC1 , NPC2 , NPC3 , NPC4 , NPC5 , NPC6 , NPC7
При желании количество неписей и их построение можно поменять произвольным образом

Сообщение отредактировал justshurik - Feb 4 2006, 01:52
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

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

 



Текстовая версия Сейчас: 7th July 2025 - 07:25