Invisible Object - генерирует PLC объекты.
Скрипт спавнящий разных PLC объекты на локациях.
AM_PLC_SP_[+ TAG_OBJECT_SELF] - наши объекты.
UserDefinedEventNumber() == 7000 - Сигнал скрипту
Если установить на скрытый объект LocalFloat == "RandomLocation"
то ее значение будет радиусом на которм будет пояляться объект.
Если поставить один объект в точку, то все следующие будут появляться на его месте.
Если не ставить НИЧЕГО, то все бъекты будут создаваться на этом невидимом объекте.
Все объекты что должны появиться должны быть присовены на стринг невидимого объекта ResRef_PLC_1, ResRef_PLC_2 и т.д. ресрефом.
NSS
//:://////////////////////////////////////////////
//:: OnUserDefaine am_cud_spawn
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
СКРИПТ НЕПОСРЕДСТВЕННО ИСПОЛНЯЕТ ОБМЕН PLC_
ОБЪЕКТОВ В ЛОКАЦИЯХ В СЛУЧАЕ РАЗРУШЕНИЯ И
В СЛУЧАЕ ВХОДА РС В ЛОКАЦИЮ ПО СИГНАЛУ
Скрипт спавнящий разных PLC объекты на локациях.
AM_PLC_SP_[+ТАГ OBJECT_SELF] - наши объекты.
*/
//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 28.11.2005
//:://///////////////////////////////////////////
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);
}
}
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()
{
int nEvent = GetUserDefinedEventNumber();
if (GetLocalInt(OBJECT_SELF, "STOP")) return; // Отключаем, если надо
if (GetLocalInt(OBJECT_SELF, "DAYS_WAITING")>0) return;
//======================== USER DEFINED EVENT===================================
if (nEvent == 7000)
// nEvent == 7000 - сигнализируем скриптом.
{
if (GetLocalInt(OBJECT_SELF, "STOP"))
return;
object oSelf = OBJECT_SELF;
string sTag = GetTag(oSelf); // Таг невидимого объекта (Общий таг группы)
object oPlc = GetNearestObjectByTag("AM_PLC_SP_"+sTag);
int i=1;
string sResRef = GetLocalString(oSelf, "ResRef_PLC_"+IntToString(i));
location lLoc; // Место где появляется наш объект
// Задержка для стандартных объектов, зависит от имени OBJECT_SELF
if(GetName(oSelf)=="Spawn PLC System")
SetLocalInt(oSelf, "DAYS_WAITING", Random(6)+1);
float f = GetLocalFloat(oSelf, "RandomLocation");
if(f!=0.0)lLoc = CreateRandomLocation(oSelf, f);
// Если установить на скрытый объект LocalFloat == "RandomLocation"
// то ее значение будет радиусом на которм будет пояляться объект.
// Если поставить один объект в точку, то все следующие будут
// появляться на его месте. Если не ставить НИЧЕГО, то все объекты
// будут создаваться на этом невидимом объекте.
if(f==0.0)
{
if(!GetLocalInt(oSelf, "DO_THIS"))
{
if(oPlc != OBJECT_INVALID)
{
SetLocalLocation(oSelf, "SPAWN", GetLocation(oPlc));
}
else
{
SetLocalLocation(oSelf, "SPAWN", GetLocation(oSelf));
}
SetLocalInt(oSelf, "DO_THIS", TRUE);
}
lLoc = GetLocalLocation(oSelf, "SPAWN");
}
while(sResRef!="")
{
i++;
sResRef=GetLocalString(oSelf, "ResRef_PLC_"+IntToString(i));
}
// Так, как вверху, условие было для первого пустого значения
// то один порядковый номер мы отнимаем из результата
i = i-1;
Debug("Общее число объектов - "+IntToString(i));
int iNext = Random(i)+1;
sResRef = GetLocalString(oSelf, "ResRef_PLC_"+IntToString(iNext));
Debug("Следующий - "+IntToString(iNext));
//----------------------------------------------------------------------
// Если выпал тот же ResRef, что стоит здесь
//----------------------------------------------------------------------
if(sResRef == GetResRef(oPlc))
{
Debug(IntToString(iNext)+" - этому PLC выпало опять быть здесь.");
iNext++; // Увеличиваем его номер на еденицу
if(iNext > i) iNext = 1;
// Если номер больше общего кол-ва PLC, то начинаем с первого.
Debug(IntToString(iNext)+" - сменим номер на еденицу больше.");
}
// Следующий объект на это место
object oNext = CreateObject(OBJECT_TYPE_PLACEABLE, GetLocalString(oSelf, "ResRef_PLC_"+IntToString(iNext)), lLoc,0, "AM_PLC_SP_"+sTag);
//----------------------------------------------------------------------
// Если мы открывали ящик и в нем уже есть лут
//----------------------------------------------------------------------
if (GetHasInventory(oPlc))
{
object oItem = GetFirstItemInInventory(oPlc);
while (GetIsObjectValid(oItem))
{
string sTag = GetTag(oItem); // Debag message
Debug("Destroy Item - "+sTag);
DestroyObject(oItem);
oItem = GetNextItemInInventory(oPlc);
}
}
DestroyObject(oPlc);
}
//------------------------------------------------------------------------------
}
Таким кодом я перебираю на локации объекты. Каждый день скриптом на хертбите. Т.е. я отмечаю каждый объект что он был сегодня уже на локации.
NSS
while (oObject != OBJECT_INVALID)
{
if (GetObjectType(oObject) == OBJECT_TYPE_PLACEABLE)
{
if(GetName(oObject)=="Spawn PLC System")
{
int i = GetLocalInt(oObject, "DAYS_WAITING"); // Сколько дней осталось
if(i!=0)SetLocalInt(oObject, "DAYS_WAITING", i-1);
Debug(GetTag(oObject)+" - PLC будет в локации "+GetName(GetArea(oObject))
+" дней: "+IntToString(GetLocalInt(oObject, "DAYS_WAITING")));
}
}
oObject = GetNextObjectInArea(oArea);
}
Этим скриптом непосредственно меняю плейсы уже на входже в локацию игроком.
NSS
object oObject = GetFirstObjectInArea(OBJECT_SELF);
while (oObject != OBJECT_INVALID)
{
if (GetObjectType(oObject) == OBJECT_TYPE_PLACEABLE)
{
if(GetName(oObject)=="Spawn PLC System")
{
DelayCommand(f, SignalEvent(oObject, EventUserDefined(7000)));
f=f+0.2; // Сделай паузу!
Debug(GetTag(oObject)+" - PLC будет в локации "+GetName(GetArea(oObject))
+" дней: "+IntToString(GetLocalInt(oObject, "DAYS_WAITING")));
}
}
oObject = GetNextObjectInArea(OBJECT_SELF);
}
Как все это выгляджит в реале? У меня скажем локация, в ней 10 НПС и у них свои сундуки. Таверна. Прошел день, скрипт хертбита дал отмашку, что день. Пробежался по локе, отметил что были здесь день. У кого это последний день он отметил что пора менять. Как только РС вошел в локу, то скрипт обменял эти объекты.
Для чего это сделано? Например у таверны стоит куча повозок. Каждый день два одна из них меняется. За неделю все меняются. Или на случайных локациях спавнятся деревья, палатки и прочее. Конечно все трудно описать, настроить тоже будет не легко новичку. Но если захзотеть, то можно. Ну и вопросы задавать никто не запрещает. Или в таверне через неделю сменились все НПС постояльцы а с ними и их сундуки