![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
![]()
Сообщение
#1
|
|
Level 5 ![]() ![]() Класс: Друид Характер: Lawful Neutral Раса: Человек ![]() |
Помогите пожалуйсто с решением проблемы. Предположим у меня 20 жилых домов (не играющих большой роли в игре), обязательно ли делать для каждого отдельную локацию? Или может быть возможно чтобы на одной локации происходила случайная генерация?
|
![]() |
![]()
Сообщение
#2
|
|
Миловидный Бегрюссунг ![]() Класс: Воин Характер: Chaotic Good Раса: Человек NWN: Модмейкер Проклятие Левора Порядок Времени ![]() |
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 НПС и у них свои сундуки. Таверна. Прошел день, скрипт хертбита дал отмашку, что день. Пробежался по локе, отметил что были здесь день. У кого это последний день он отметил что пора менять. Как только РС вошел в локу, то скрипт обменял эти объекты. Для чего это сделано? Например у таверны стоит куча повозок. Каждый день два одна из них меняется. За неделю все меняются. Или на случайных локациях спавнятся деревья, палатки и прочее. Конечно все трудно описать, настроить тоже будет не легко новичку. Но если захзотеть, то можно. Ну и вопросы задавать никто не запрещает. Или в таверне через неделю сменились все НПС постояльцы а с ними и их сундуки (IMG:style_emoticons/kolobok_light/wink3.gif) |
![]() ![]() |
Текстовая версия | Сейчас: 2nd May 2025 - 20:34 |