СЕРИЯ "СКРИПТЫ СТАРОЙ БАЗЫ" ЦИКЛ "СКРИПТЫ ДЯДЮШКИ MILEZ'А"
Автор:::::::::::::::::Milez:::::::::::::::::::::::::::::: Jun 29 2003 Еще один спавн. Фишка в том, что респавн существ основан на вероятностом законе, а не на времени, через которое спавн должен происходить. Может кому пригодиться. Основной скрипт на Heartbeat плейсабла, играющего роль спавна:
Neverwinter Script Source | void main() { object oSelf=OBJECT_SELF; object oPC=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC); if (!GetIsObjectValid(oPC)) return; float fActDist=IntToFloat(GetMaxHitPoints()); // расстоЯние, на к-ом должен поЯвитьсЯ игрок от спавна, чтобы тот заработал if (GetDistanceBetween(oPC,oSelf)>fActDist) return; int iSpawnDist=GetReflexSavingThrow(oSelf); // макс. расст-ие, на к-ом будут поЯвлЯться сущ-ва int iSpawnChance=GetWillSavingThrow(oSelf); // вероЯтность поЯвлениЯ существа, % int iMaxSpawn=GetFortitudeSavingThrow(oSelf); // макс. кол-во сущ-в, поддерживаемых спавном int iSpawned=GetLocalInt(oSelf,"SpawnedCreatures"); object oMonster; string sMonster; float fSpawnAngle; float fSpawnDist; vector vSpawnPlace; location lSpawnLoc; if (iSpawned<iMaxSpawn) { if (d100()<=iSpawnChance) { iSpawned++; fSpawnDist=IntToFloat(Random(iSpawnDist)+1); fSpawnAngle=IntToFloat(Random(360)); vSpawnPlace=GetPosition(oSelf); vSpawnPlace.x+=fSpawnDist*cos(fSpawnAngle); vSpawnPlace.y+=fSpawnDist*sin(fSpawnAngle); lSpawnLoc=Location(GetArea(oSelf),vSpawnPlace,IntToFloat(Random(360))); // Здесь вставьте подобным образом список сущ-в, которые будут спавнитьсЯ switch (Random(2)) { case 0: sMonster="nw_skeleton"; break; case 1: sMonster="nw_zombie01"; break; } oMonster=CreateObject(OBJECT_TYPE_CREATURE,sMonster,lSpawnLoc); SetLocalObject(oMonster,"MySpawner",oSelf); SetLocalObject(oSelf,"LastMonsterSpawned",oMonster); } } SetLocalInt(oSelf,"SpawnedCreatures",iSpawned); } |
В OnUserDefined стандартного скрипта nw_c2_defaultd добавим обработчик на событие 1007 (смерть), для регистрации смерти существа на мастер-спавне:
Neverwinter Script Source | ... object oSpawnPoint; switch(iEvent) { ... case 1007: oSpawnPoint=GetLocalObject(OBJECT_SELF,"MySpawner"); if (GetIsObjectValid(oSpawnPoint)) { SetLocalInt(oSpawnPoint,"SpawnedCreatures",GetLocalInt(oSpawnPoint,"SpawnedCreatures")-1); } break; ... } |
Модификации возможны самые разные. Можно добавить флаг на макс. спавн, чтобы спавн работал только 1 раз, можно внести ограничения по времени. Короче, делайте что хотите Настраивается спавн до обидног просто: с св-вах плейсабла-спавна (я использовал невидимый объект) ставите: Max Hit Points - расстояние, на котором должен появиться игрок, чтобы спавн заработал. Reflex Save - макс. расст-ие от спавна, на котором будут создаваться сущ-ва. Fortitude Save - макс. кол-во существ, к-ое будет поддерживаться спавном. Will Save - вероятность того, что существо будет создано при каждом данном вызове скрипта, в процентах (100 - существа будут спавниться всегда, 0 - спавн отключен. 100 используйте очень осторожно: спавн будет постоянно поддерживать популяцию монстров, игрок просто может не успеть всех прибить!) ************************************************************************************
Автор:::::::::::::::::Milez:::::::::::::::::::::::::::::: Feb 24 2004 Ээээх, давно я тут не писал. Времени скриптовать не было. И вот жизнь подладилась, вышла ХотУ и... Сбылась мечта идиота! Я наконец-то смог сделать нормального призрака! Вот функция:
Neverwinter Script Source | void SetGhostState(object oPC) { // polymorph, so we can't equip/use things, cast spells etc. effect eGhost = EffectPolymorph(POLYMORPH_TYPE_SPECTRE,TRUE); // this way we can pass thru other mobs eGhost = EffectLinkEffects(EffectCutsceneGhost(),eGhost); // ghosts are invisible, you know eGhost = EffectLinkEffects(EffectInvisibility(INVISIBILITY_TYPE_DARKNESS),eGhost); // ghosts can't attack as well eGhost = EffectLinkEffects(EffectDazed(),eGhost); // others can't detect ghosts, no way! eGhost = EffectLinkEffects(EffectEthereal(),eGhost); // these effects can't be dispelled, as well as they can't be removed by rest eGhost = SupernaturalEffect(eGhost);
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eGhost,oPC); SetPlotFlag(oPC,TRUE); // ghosts are invincible SetLocalInt(oPC,"IAmAGhost",1); } |
Ставим ее на OnDeath, а скрипт ресурректа правим так, чтобы, будучи скастованным на чара, проверял соотв-ую лок. переменную и, если надо, "оживлял" чара, скидывая эффкты.
КОНЕЦ ЦИКЛА "СКРИПТЫ ДЯДЮШКИ MILEZ'А" СЕРИИ "СКРИПТЫ СТАРОЙ БАЗЫ"
|