ОК!
Для полной замены базового
WalkWayPoints, нужно сделать:
1. Меняем скрипт прерывания и окончания диалога
nw_walk_wp2. Переписываем скрипт спавна
nw_c2_default93. Переписываем скрипт OnPerception монстров
NW_C2_DEFAULT24. Пишем новый скрипт для ХБ монстров
nw_c2_default15. Ну и сама новая функция ходьбы в инклюде
gg_walkwayПеренастройка модуля никакая не потребуется… НПС ходят по стандартным точкам ходьбы сделанным ранее редактором. Единственное отличие точки поста, я заменил на свои: Тег НПС+_POST
Стоит т.ж. учитывать локалку на НПС "WPOIN_GO", если нужно для сценок и быстрого старта функции ходьбы, то ее нужно обнулять… Но это не критично, т.к. когда герой покинет область НПС, то автоматом обнулится и эта локалка. Вот и все

скрипт прерывания и окончания диалога
nw_walk_wpNeverwinter Script
//:://////////////////////////////////////////////////
//:: Created By: Gennady nw_walk_wp
//:://////////////////////////////////////////////////
void main()
{
SetLocalInt(GetFirstPC(), "ConversationState", 0);
SetLocalInt(OBJECT_SELF,"WPOIN_GO",0);
SetCutsceneMode(GetFirstPC(), FALSE);
SetImmortal(GetFirstPC(), FALSE);
SetPlotFlag(GetFirstPC(), FALSE);
}
скрипт спавна
nw_c2_default9 Тут пробита выдача золота и зелья. но это уж дело вкуса, сами пишите кому чего нужно…
Neverwinter Script
//:://////////////////////////////////////////////////
//:: Created By: Gennady nw_c2_default9
//:://////////////////////////////////////////////////
// Дать золото
// object oTarget - Кому даем
// int nMnGold - множитель *(случайность от 1 до 10)
void CreateGold(object oTarget, int nMnGold);
// Дать зелье
// object oTarget - Кому даем
void CreateZel(object oTarget);
////////////////////////////////////////////////////////////////////////////////
//________________ Дать золото _________________________________________________
void CreateGold(object oTarget, int nMnGold)
{
int nGold = Random(10)+1; nGold = nMnGold*nGold;
CreateItemOnObject("nw_it_gold001", oTarget, nGold);
}
//_________ Дать зелье __________
void CreateZel(object oTarget)
{
int nRandom = Random(32) + 1;
string sItem;
switch (nRandom)
{
case 1: sItem = "nw_it_mpotion022"; break;
case 2: sItem = "nw_it_mpotion023"; break;
case 3: sItem = "nw_it_mpotion021"; break;
case 4: sItem = "nw_it_mpotion001"; break;
case 5: sItem = "nw_it_mpotion020"; break;
case 6: sItem = "nw_it_medkit001"; break;
case 7: sItem = "nw_it_medkit002"; break;
case 8: sItem = "nw_it_mpotion009"; break;
case 9: sItem = "nw_it_mpotion010"; break;
case 10: sItem = "nw_it_mpotion013"; break;
case 11: sItem = "nw_it_mpotion014"; break;
case 12: sItem = "nw_it_mpotion019"; break;
case 13: sItem = "nw_it_mpotion005"; break;
case 14: sItem = "nw_it_mpotion020"; break;
case 15: sItem = "nw_it_mpotion022"; break;
case 16: sItem = "nw_it_mpotion023"; break;
case 17: sItem = "nw_it_mpotion021"; break;
case 18: sItem = "nw_it_mpotion001"; break;
case 19: sItem = "nw_it_mpotion020"; break;
case 20: sItem = "nw_it_medkit001"; break;
case 21: sItem = "nw_it_medkit002"; break;
case 22: sItem = "nw_it_mpotion009"; break;
case 23: sItem = "nw_it_mpotion003"; break;
case 24: sItem = "nw_it_mpotion002"; break;
case 25: sItem = "nw_it_mpotion011"; break;
case 26: sItem = "nw_it_mpotion018"; break;
case 27: sItem = "nw_it_mpotion016"; break;
case 28: sItem = "nw_it_mpotion006"; break;
case 29: sItem = "nw_it_mpotion015"; break;
case 30: sItem = "nw_it_mpotion004"; break;
case 31: sItem = "nw_it_mpotion017"; break;
case 32: sItem = "nw_it_mpotion007"; break;
}
CreateItemOnObject(sItem, oTarget, 1);
}
////////////////////////////////////////////////////////////////////////////////
void main()
{
object oSelf = OBJECT_SELF ;
int nRaType = GetRacialType(oSelf);
if(nRaType == RACIAL_TYPE_UNDEAD || nRaType == RACIAL_TYPE_ANIMAL ||
nRaType == RACIAL_TYPE_VERMIN) return; // Нежить, животное, паразит.
if(GetLevelByClass(CLASS_TYPE_COMMONER, oSelf) >= 1) // Простолюдин
CreateGold(oSelf, 10);
if (d10() > 5) return;
if(d10() > 7) CreateZel(oSelf);
if(d10() > 5) CreateGold(oSelf, 3);
}
скрипт OnPerception монстров
NW_C2_DEFAULT2Neverwinter Script
//:://////////////////////////////////////////////////
//:: NW_C2_DEFAULT2
/*
Default OnPerception event handler for NPCs.
Handles behavior when perceiving a creature for the
first time.
*/
//:://////////////////////////////////////////////////
//:: Created By: Gennady
//:: Created On: 3.11.2006
#include "nw_i0_generic"
void main()
{
// * if not runnning normal or better Ai then exit for performance reasons
// * if not runnning normal or better Ai then exit for performance reasons
if (GetAILevel() == AI_LEVEL_VERY_LOW) return;
object oPercep = GetLastPerceived();
int bSeen = GetLastPerceptionSeen();
// This will cause the NPC to speak their one-liner
// conversation on perception even if they are already
// in combat.
if(GetSpawnInCondition(NW_FLAG_SPECIAL_COMBAT_CONVER
SATION)
&& GetIsPC(oPercep)
&& bSeen)
{
SpeakOneLinerConversation();
}
// March 5 2003 Brent
// Had to add this section back in, since modifications were not taking this specific
// example into account -- it made invisibility basically useless.
//If the last perception event was hearing based or if someone vanished then go to search mode
if ((GetLastPerceptionVanished()) && GetIsEnemy(GetLastPerceived()))
{
object oGone = GetLastPerceived();
if((GetAttemptedAttackTarget() == GetLastPerceived() ||
GetAttemptedSpellTarget() == GetLastPerceived() ||
GetAttackTarget() == GetLastPerceived()) && GetArea(GetLastPerceived()) != GetArea(OBJECT_SELF))
{
//SpeakString("dude...like disappeared.");
ClearAllActions();
DetermineCombatRound();
}
}
// This section has been heavily revised while keeping the
// pre-existing behavior:
// - If we're in combat, keep fighting.
// - If not and we've perceived an enemy, start to fight.
// Even if the perception event was a 'vanish', that's
// still what we do anyway, since that will keep us
// fighting any visible targets.
// - If we're not in combat and haven't perceived an enemy,
// see if the perception target is a PC and if we should
// speak our attention-getting one-liner.
if (GetIsFighting(OBJECT_SELF)) {
// don't do anything else, we're busy
MyPrintString("GetIsFighting: TRUE");
}
// * BK FEB 2003 Only fight if you can see them. DO NOT RELY ON HEARING FOR ENEMY DETECTION
else if (GetIsEnemy(oPercep) && bSeen) {
MyPrintString("GetIsEnemy: TRUE");
// We spotted an enemy and we're not already fighting
if(!GetHasEffect(EFFECT_TYPE_SLEEP)) {
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) {
MyPrintString("DetermineSpecialBehavior");
DetermineSpecialBehavior();
} else {
MyPrintString("DetermineCombatRound");
SetFacingPoint(GetPosition(oPercep));
SpeakString("NW_I_WAS_ATTACKED", TALKVOLUME_SILENT_TALK);
DetermineCombatRound();
}
}
} else {
if (bSeen) {
MyPrintString("GetLastPerceptionSeen: TRUE");
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL)) {
DetermineSpecialBehavior();
} else if (GetSpawnInCondition(NW_FLAG_SPECIAL_CONVERSATION)
&& GetIsPC(oPercep))
{
// The NPC will speak their one-liner conversation
// This should probably be:
// SpeakOneLinerConversation(oPercep);
// instead, but leaving it as is for now.
ActionStartConversation(OBJECT_SELF);
}
}
// activate ambient animations or walk waypoints if appropriate
if (!IsInConversation(OBJECT_SELF))
{
if (GetIsPC(oPercep) &&
(GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS)
|| GetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS_AVI
AN)
|| GetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMA
TIONS)
|| GetIsEncounterCreature()))
{
SetAnimationCondition(NW_ANIM_FLAG_IS_ACTIVE);
}
}
}
// Send the user-defined event if appropriate
if(GetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT) && GetLastPerceptionSeen())
{
SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_PERCEIVE));
}
}
скрипт ХБ монстров
nw_c2_default1Neverwinter Script
//:://////////////////////////////////////////////////
//:: Created By: Gennady nw_c2_default1
//:://////////////////////////////////////////////////
#include "gg_walkway"
void main()
{
object oSelf = OBJECT_SELF;
if(GetArea(GetFirstPC()) != GetArea(oSelf)) // если ПС нет в локе
{
AssignCommand(oSelf, ClearAllActions(TRUE));
SetLocalInt(oSelf,"WPOIN_GO",0);
return;
}
if (GetIsInCombat(oSelf)) {SetLocalInt(oSelf,"WPOIN_GO",0); return;}
if (IsInConversation(oSelf)) {SetLocalInt(oSelf,"WPOIN_GO",0); return;}
WayPOST(); //ДЛЯ ПОСТОВОГО
WalkWayPoints(); // ДЛЯ ХОДЬБЫ ПО ТОЧКАМ
ActAttackNPC(); // Атака врага
if (GetLocalInt(oSelf, "FLAG_HEARTBEAT") == 1)
SignalEvent(oSelf, EventUserDefined(EVENT_HEARTBEAT));
}
инклюда ходьбы
gg_walkwayNeverwinter Script
//:://////////////////////////////////////////////////
//:: #include "gg_walkway"
//:: Created By: Gennady
//:: Created On: 3.11.2006
//:://////////////////////////////////////////////////
// Атака врага, если герой в радиусе 15 метров
void ActAttackNPC(object oSelf = OBJECT_SELF);
//ДЛЯ ПОСТОВОГО
// Вернет на точку поста, повернет в сторону вектора точки
// Точка поста равна тэгу ПС +"_POST"
// Должна быть более 2 метров от ближайшей точки ходьбы
// Если интеллект выше 20, и есть точки ходьбы - ночью ходит, днем пост
void WayPOST(object oSelf = OBJECT_SELF);
// ДЛЯ ХОДЬБЫ ПО ТОЧКАМ расположенным в этой области
void WalkWayPoints(object oSelf = OBJECT_SELF);
/////////////////////////////////////////////////////////////////////////////
// Атака врага, если герой в радиусе 15 метров /////////////////////////////
void ActAttackNPC(object oSelf = OBJECT_SELF)
{
object oVrag = GetFirstObjectInShape(SHAPE_SPHERE, 15.0, GetLocation(oSelf), TRUE, OBJECT_TYPE_CREATURE);
if (GetDistanceBetween(GetFirstPC(), oSelf) < 15.0)
{
while (GetIsObjectValid(oVrag))// Проверить враждебного ПС в радиусе 15 метров
{
if (GetObjectSeen(oVrag, oSelf) && GetIsEnemy(oVrag, oSelf))
{
AssignCommand(oSelf, ClearAllActions(TRUE));
AssignCommand(oSelf, ActionAttack(oVrag));
return;
}
oVrag = GetNextObjectInShape(SHAPE_SPHERE, 15.0, GetLocation(oSelf), TRUE, OBJECT_TYPE_CREATURE);
}
}
}
/////////////// ДЛЯ ПОСТОВОГО //////////////////////////////////////////
void WayPOST(object oSelf = OBJECT_SELF)
{
object oWayPOST = GetNearestObjectByTag(GetTag(oSelf)+"_POST");
if (GetIsObjectValid(oWayPOST))
{
if (GetAbilityScore(oSelf, ABILITY_INTELLIGENCE) > 20)
{
if (GetIsNight())
{
if (GetDistanceBetween(oWayPOST, oSelf) < 1.0)
SetLocalInt(oSelf,"WPOIN_GO",0);
WalkWayPoints(oSelf); return;
}
else
SetLocalInt(oSelf,"WPOIN_GO",1);
}
float fFacing = GetFacing(oWayPOST);
ClearAllActions();
ActionForceMoveToObject(oWayPOST, FALSE, 0.0, 30.0);
ActionDoCommand(DelayCommand(0.3, SetFacing(fFacing)));
}
}
// ДЛЯ ХОДЬБЫ ПО ТОЧКАМ расположенным в этой области //////////////////////
void WalkWayPoints(object oSelf = OBJECT_SELF)
{
if (GetLocalInt(oSelf, "WPOIN_GO") == 1) return;
object oWay = GetNearestObjectByTag("WP_"+GetTag(oSelf)+"_01");
int i =1;
int iNPoint;
string sPoint;
if (GetIsObjectValid(oWay))
{
ClearAllActions();
SetLocalInt(oSelf,"WPOIN_GO",1);
}
else return;
oWay = GetNearestObject(OBJECT_TYPE_WAYPOINT, oSelf,i);
while (GetIsObjectValid(oWay))// Цикл определить ближайшую точку
{
i++;
string sTag = GetTag(oWay);
// Тэг точки без 3 последних букв
string sTreb = GetStringLeft(sTag, GetStringLength(sTag)-3);
if("WP_"+GetTag(oSelf) == sTreb)
{
iNPoint = StringToInt(GetStringRight(sTag, 2));
if (iNPoint == 0)
iNPoint = StringToInt(GetStringRight(sTag, 1));
break ;
}
oWay = GetNearestObject(OBJECT_TYPE_WAYPOINT, oSelf,i);
}
if (iNPoint < 10) sPoint = "0" + IntToString(iNPoint);
else sPoint = IntToString(iNPoint);
// Определили ближайшую точку
oWay = GetNearestObjectByTag("WP_"+GetTag(oSelf)+"_"+sPoint);
while (GetIsObjectValid(oWay)) // Цикл на возрастание точек
{
ActionForceMoveToObject(oWay, FALSE, 0.0, 30.0);
iNPoint++;
if (iNPoint < 10) sPoint = "0" + IntToString(iNPoint);
else sPoint = IntToString(iNPoint);
oWay = GetNearestObjectByTag("WP_"+GetTag(oSelf)+"_"+sPoint);
}
iNPoint = iNPoint-1;
if (iNPoint < 10) sPoint = "0" + IntToString(iNPoint);
else sPoint = IntToString(iNPoint);
oWay = GetNearestObjectByTag("WP_"+GetTag(oSelf)+"_"+sPoint);
while (GetIsObjectValid(oWay)) // Цикл на убывание точек
{
ActionForceMoveToObject(oWay, FALSE, 0.0, 30.0);
iNPoint--;
if (iNPoint < 10) sPoint = "0" + IntToString(iNPoint);
else sPoint = IntToString(iNPoint);
oWay = GetNearestObjectByTag("WP_"+GetTag(oSelf)+"_"+sPoint);
}
ActionDoCommand(SetLocalInt(oSelf,"WPOIN_GO",0));
}
P.S. Скрипты все проверены и работают уже в моем моде 2 года, нареканий у меня к ним пока нет…