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

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

 Правила этого форума ПРАВИЛА РАЗДЕЛА
> случайная генерация локаций
Milfes
сообщение Jul 20 2006, 22:30
Сообщение #1


Level 5
**

Класс: Друид
Характер: Lawful Neutral
Раса: Человек



Помогите пожалуйсто с решением проблемы. Предположим у меня 20 жилых домов (не играющих большой роли в игре), обязательно ли делать для каждого отдельную локацию? Или может быть возможно чтобы на одной локации происходила случайная генерация?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
 
Открыть новую тему
Ответов
Aiwan
сообщение Jul 23 2006, 02:22
Сообщение #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)
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

Сообщений в этой теме
- Milfes   случайная генерация локаций   Jul 20 2006, 22:30
- - Aiwan   Опыт подсказывает что лучше чделать 10 уникальных ...   Jul 20 2006, 22:43
- - helvene   QUOTE(Milfes @ Jul 20 2006, 23:30) 88085И...   Jul 20 2006, 22:47
|- - virusman   QUOTE(helvene @ Jul 20 2006, 23:47) 88088...   Jul 21 2006, 00:44
- - Milfes   QUOTEОпыт подсказывает что лучше чделать 10 уникал...   Jul 20 2006, 22:56
- - Aiwan   QUOTE(virusman @ Jul 21 2006, 03:44) 8809...   Jul 21 2006, 01:06
- - Клемент Астилон   Да вообще полезный патч вроде сделали Список Изм...   Jul 21 2006, 03:49
|- - virusman   QUOTE(Клемент Астилон @ Jul 21 2006, 04:4...   Jul 21 2006, 08:01
- - helvene   Пользуйтесь   Jul 21 2006, 09:05
|- - virusman   QUOTE(helvene @ Jul 21 2006, 10:05) 88115...   Jul 21 2006, 10:31
- - helvene   Очевидно, никакого...   Jul 21 2006, 10:35
- - virusman   А жаль, я бы от динамических лок не отказался. В ...   Jul 21 2006, 10:42
- - Nymor   ну генерацию обьектов можно сделать, но не тайлов   Jul 21 2006, 14:46
- - maximal_up   QUOTE(Milfes @ Jul 20 2006, 23:56) 88090Т...   Jul 21 2006, 15:09
|- - denis0k   QUOTE(maximal_up @ Jul 21 2006, 16:09) 88...   Jul 21 2006, 19:45
- - Milfes   QUOTEНаконец, самый простой и доступный вариант, б...   Jul 21 2006, 17:39
|- - virusman   QUOTE(Milfes @ Jul 21 2006, 18:39) 88135 ...   Jul 21 2006, 19:36
- - -fenix-   А как на счет того, что все это будет криейтица пр...   Jul 21 2006, 18:15
- - Zirrex   Берем большую локацию, делаем в ней 10 комнат, зап...   Jul 21 2006, 18:50
- - Milfes   А как делать затирание карты?   Jul 21 2006, 20:34
- - Zirrex   Milfes, в последних патчах появилась доработка к ф...   Jul 21 2006, 22:09
- - Milfes   Проблема в том, что у меня нет пока последнего пат...   Jul 22 2006, 23:53
|- - Dik Morris   QUOTE(Milfes @ Jul 23 2006, 01:53) 88187 ...   Jul 24 2006, 16:04
- - Aiwan   Invisible Object - генерирует PLC объекты. Скрипт ...   Jul 23 2006, 02:22
- - Milfes   Огромное спасибо! Жаль только немного, но для ...   Jul 24 2006, 18:13
- - Existor   На всякий случай напишу следующую памятку: есть во...   Jul 25 2006, 06:40
- - ReyBrujo   Могу предложить еще один вариант, в котором всего ...   Jun 8 2010, 15:07


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

 



Текстовая версия Сейчас: 2nd May 2025 - 20:34