Для оживления жизни на шарде, пришла мысль организовать следующее.
Хочется создать 3(4\5\6 - не суть) стороны, не любящих друг друга, например
Elf - подраса Drow
Dwarf - подраса Duergar
Любая иная раса - без подрасы
Что хочется видеть в итоге - Drow + Duergar'ы против остальных.
Проблема - отсутствие представления, как расставить PC на основе поля Subrace like\dislike по отношению к другим PC.
Из умных мыслей - пихать скрипт на х\б... на этом мысли кончились
Подскажите, как сие реализовать возможно?
QUOTE |
Drow + Duergar'ы против остальных. |
QUOTE (balrog @ Apr 4 2005, 21:04) |
Корче, скоро ангелы с демонами будут под ручку ходить |
По-моему никак, только через плагин к NWNEX2
Репутация и функции работы с ней реализованы довольно криво для мультика. По хорошему ничего не выйдет, но извратиться можно всегда
На OnClientEnter проверять субрасу, проходиться по всем остальным игрокам и делать SetPCDislike, где нужно.
(Не делал и не проверял, но теоретически должно работать.)
virusman кстати, чего это на вполне безобидное
<img src="http://www.rpgplanet.ru/forums/style_avatars/virusman.gif" alt="" border="0" height="115" width="102"> (аватарка)
требует кукисов? Колись, картинка там, или нет?
Не знаю, это какая-то проблема с rpgplanet.. Закачал аватар сюда.
А вообще, такие сообщения лучше отправлять в приват.
А я, вот, на Nighfall Dreams извратнулся, скрипт автодиза, для Хеартбита модуля, в целом работает, но не без глюков, которых, найти не смог... Скрипт щас используется на шарде.
Neverwinter Script Source |
///////////////////////// /***********************/ /***Created by Buldog***/ /***********************/ /*** Date: 04.04.2005***/ /***********************/ ///////////////////////// void CheckParty(object oPC1, object oPC2) { object oPM = GetFirstFactionMember(oPC1); object oGood, oEvil; int g = 0, e = 0, nRace, nAlign; int nAlign1 = GetAlignmentGoodEvil(oPC1); int nRace1 = GetRacialType(oPC1); string sSR1 = GetStringUpperCase(GetSubRace(oPC1)); string sSR; if(nRace1 == RACIAL_TYPE_HALFORC || nRace1 == RACIAL_TYPE_ELF && TestStringAgainstPattern("**DROW**", sSR1) || nRace1 == RACIAL_TYPE_ELF && TestStringAgainstPattern("**DARK**", sSR1) || nRace1 == RACIAL_TYPE_HUMAN && nAlign1 == ALIGNMENT_EVIL) { oEvil = oPC1; oGood = oPC2; } else { oEvil = oPC2; oGood = oPC1; } while(GetIsObjectValid(oPM)) { nRace = GetRacialType(oPM); nAlign = GetAlignmentGoodEvil(oPM); sSR = GetStringUpperCase(GetSubRace(oPM)); if(nRace == RACIAL_TYPE_HALFORC || nRace == RACIAL_TYPE_ELF && TestStringAgainstPattern("**DROW**", sSR) || nRace == RACIAL_TYPE_ELF && TestStringAgainstPattern("**DARK**", sSR) || nRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_EVIL) { e++; } else { g++; } oPM = GetNextFactionMember(oPC1); } if(e > g) { RemoveFromParty(oGood); } else { RemoveFromParty(oEvil); } } void SetDislike(object oTest) { object oFL, oTFL, oPC = GetFirstPC(); int nPCRace, nTRace, nLike, nTLike, nAlign, nTAlign; string sSubRace, sTSubRace, sArea; nTRace = GetRacialType(oTest); nTAlign = GetAlignmentGoodEvil(oTest); sTSubRace = GetStringUpperCase(GetSubRace(oTest)); sArea = GetTag(GetArea(oTest)); oTFL = GetFactionLeader(oTest); while(GetIsObjectValid(oPC)) { nPCRace = GetRacialType(oPC); nAlign = GetAlignmentGoodEvil(oPC); nLike = GetIsEnemy(oTest, oPC); nTLike = GetIsEnemy(oPC, oTest); sSubRace = GetStringUpperCase(GetSubRace(oPC)); oFL = GetFactionLeader(oPC); if(nLike && !nTLike) SetPCLike(oTest, oPC); if(!nLike && nTLike) SetPCLike(oPC, oTest); if(!nLike && sArea != "Arena" && oPC != oTest && !GetIsDM(oPC)) { if(nTRace == RACIAL_TYPE_HUMAN && nTAlign == ALIGNMENT_GOOD) { if(nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_EVIL) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_HALFORC) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_ELF) { if(TestStringAgainstPattern("**DROW**", sSubRace) || TestStringAgainstPattern("**DARK**", sSubRace)) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } } } if(nTRace == RACIAL_TYPE_HUMAN && nTAlign == ALIGNMENT_NEUTRAL) { if(nPCRace == RACIAL_TYPE_HALFORC) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_ELF) { if(TestStringAgainstPattern("**DROW**", sSubRace) || TestStringAgainstPattern("**DARK**", sSubRace)) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } } } if(nTRace == RACIAL_TYPE_HUMAN && nTAlign == ALIGNMENT_EVIL) { if(nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_GOOD) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_ELF || nPCRace == RACIAL_TYPE_HALFELF) { if(!TestStringAgainstPattern("**DROW**", sSubRace) && !TestStringAgainstPattern("**DARK**", sSubRace)) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } } if(nPCRace == RACIAL_TYPE_HALFLING) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } } if(nTRace == RACIAL_TYPE_ELF || nTRace == RACIAL_TYPE_HALFELF) { if(TestStringAgainstPattern("**DROW**", sTSubRace) || TestStringAgainstPattern("**DARK**", sTSubRace)) { if(nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_GOOD || nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_NEUTRAL) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_ELF || nPCRace == RACIAL_TYPE_HALFELF) { if(!TestStringAgainstPattern("**DROW**", sSubRace) && !TestStringAgainstPattern("**DARK**", sSubRace)) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } } if(nPCRace == RACIAL_TYPE_HALFLING) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } } else { if(nPCRace == RACIAL_TYPE_ELF) { if(TestStringAgainstPattern("**DROW**", sSubRace) || TestStringAgainstPattern("**DARK**", sSubRace)) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } } if(nPCRace == RACIAL_TYPE_HALFORC) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_EVIL) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } } } if(nTRace == RACIAL_TYPE_HALFLING) { if(nPCRace == RACIAL_TYPE_ELF) { if(TestStringAgainstPattern("**DROW**", sSubRace) || TestStringAgainstPattern("**DARK**", sSubRace)) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } } if(nPCRace == RACIAL_TYPE_HALFORC) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_EVIL) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } } if(nTRace == RACIAL_TYPE_HALFORC) { if(nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_GOOD || nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_NEUTRAL) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_ELF || nPCRace == RACIAL_TYPE_HALFELF) { if(!TestStringAgainstPattern("**DROW**", sSubRace) && !TestStringAgainstPattern("**DARK**", sSubRace)) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } } if(nPCRace == RACIAL_TYPE_HALFLING) { if(oTFL == oFL) CheckParty(oTest, oPC); SetPCDislike(oTest, oPC); } } } oPC = GetNextPC(); } } void main() { //Autodislike object oPC = GetFirstPC(); while(GetIsObjectValid(oPC)) { if(!GetIsDM(oPC)) SetDislike(oPC); oPC = GetNextPC(); } } |
Бедный шард... Точнее игроки с лагами...
Да нет, лагов не больше чем было до введения скрипта. Единственные жалобы, которые были, так это то, что теперь чары не могут ходить в пати с "врагами"
Тем не менее можно было сделать с меньшей нагрузкой на сервак.
В принципе можно переделать скрипт под ОнЕнтер, но тогда ни что не будет мешать игрокам отменить вар и так же ходить в одной пати. Возможно, в чем то, это даже лучше... Надо обмозговать как следует
А что такого? Типо помирились , чтобы экспы больше вместе нарубить
Угу, экспа щас вообще больной вопрос, но не будем тут про нее )
Добавлено в [mergetime]1114005436[/mergetime]
Переписал скрипт автодтзлайка на ОнЕнтер модуля, при желании игрок сможет снять дизлайк.
Neverwinter Script Source |
///////////////////////////////////// //*********************************// //********Created by Buldog********// //*********************************// //*********Date: 04.04.2005********// //*********************************// //*******Modified by Buldog********// //*********************************// //*********Date: 20.04.2005********// //*********************************// ///////////////////////////////////// //Drows - Humans Good, Humans Neutral, Elfs, Halflings //Half-Elfs - Half-Orcs, Drows, Humans Evil //Halflings - Half-Orcs, Drows, Humans Evil //Half-Orcs - Elfs, Humans Good, Halflings //Humans Good - Half-Orcs, Drows, Humans Evil //Humans Evil - Elfs, Humans Good, Halflings //Humans Neutral - Half-Orcs, Drows //Elfs - Half-Orcs, Drows, Humans Evil //Gnomes, Dwarfs - No enemies void SetDislike(object oTest) { object oFL, oTFL, oPC = GetFirstPC(); int nPCRace, nTRace, nLike, nTLike, nAlign, nTAlign; string sSubRace, sTSubRace, sArea; nTRace = GetRacialType(oTest); nTAlign = GetAlignmentGoodEvil(oTest); sTSubRace = GetStringUpperCase(GetSubRace(oTest)); sArea = GetTag(GetArea(oTest)); oTFL = GetFactionLeader(oTest); while(GetIsObjectValid(oPC)) { nPCRace = GetRacialType(oPC); nAlign = GetAlignmentGoodEvil(oPC); nLike = GetIsEnemy(oTest, oPC); nTLike = GetIsEnemy(oPC, oTest); sSubRace = GetStringUpperCase(GetSubRace(oPC)); oFL = GetFactionLeader(oPC); if(nLike && !nTLike) SetPCLike(oTest, oPC); if(!nLike && nTLike) SetPCLike(oPC, oTest); if(!nLike && sArea != "Arena" && oPC != oTest && !GetIsDM(oPC)) { if(nTRace == RACIAL_TYPE_HUMAN && nTAlign == ALIGNMENT_GOOD) { if(nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_EVIL) { SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_HALFORC) { SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_ELF) { if(TestStringAgainstPattern("**DROW**", sSubRace) || TestStringAgainstPattern("**DARK**", sSubRace)) { SetPCDislike(oTest, oPC); } } } if(nTRace == RACIAL_TYPE_HUMAN && nTAlign == ALIGNMENT_NEUTRAL) { if(nPCRace == RACIAL_TYPE_HALFORC) { SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_ELF) { if(TestStringAgainstPattern("**DROW**", sSubRace) || TestStringAgainstPattern("**DARK**", sSubRace)) { SetPCDislike(oTest, oPC); } } } if(nTRace == RACIAL_TYPE_HUMAN && nTAlign == ALIGNMENT_EVIL) { if(nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_GOOD) { SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_ELF || nPCRace == RACIAL_TYPE_HALFELF) { if(!TestStringAgainstPattern("**DROW**", sSubRace) && !TestStringAgainstPattern("**DARK**", sSubRace)) { SetPCDislike(oTest, oPC); } } if(nPCRace == RACIAL_TYPE_HALFLING) { SetPCDislike(oTest, oPC); } } if(nTRace == RACIAL_TYPE_ELF || nTRace == RACIAL_TYPE_HALFELF) { if(TestStringAgainstPattern("**DROW**", sTSubRace) || TestStringAgainstPattern("**DARK**", sTSubRace)) { if(nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_GOOD || nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_NEUTRAL) { SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_ELF || nPCRace == RACIAL_TYPE_HALFELF) { if(!TestStringAgainstPattern("**DROW**", sSubRace) && !TestStringAgainstPattern("**DARK**", sSubRace)) { SetPCDislike(oTest, oPC); } } if(nPCRace == RACIAL_TYPE_HALFLING) { SetPCDislike(oTest, oPC); } } else { if(nPCRace == RACIAL_TYPE_ELF) { if(TestStringAgainstPattern("**DROW**", sSubRace) || TestStringAgainstPattern("**DARK**", sSubRace)) { SetPCDislike(oTest, oPC); } } if(nPCRace == RACIAL_TYPE_HALFORC) { SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_EVIL) { SetPCDislike(oTest, oPC); } } } if(nTRace == RACIAL_TYPE_HALFLING) { if(nPCRace == RACIAL_TYPE_ELF) { if(TestStringAgainstPattern("**DROW**", sSubRace) || TestStringAgainstPattern("**DARK**", sSubRace)) { SetPCDislike(oTest, oPC); } } if(nPCRace == RACIAL_TYPE_HALFORC) { SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_EVIL) { SetPCDislike(oTest, oPC); } } if(nTRace == RACIAL_TYPE_HALFORC) { if(nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_GOOD || nPCRace == RACIAL_TYPE_HUMAN && nAlign == ALIGNMENT_NEUTRAL) { SetPCDislike(oTest, oPC); } if(nPCRace == RACIAL_TYPE_ELF || nPCRace == RACIAL_TYPE_HALFELF) { if(!TestStringAgainstPattern("**DROW**", sSubRace) && !TestStringAgainstPattern("**DARK**", sSubRace)) { SetPCDislike(oTest, oPC); } } if(nPCRace == RACIAL_TYPE_HALFLING) { SetPCDislike(oTest, oPC); } } } oPC = GetNextPC(); } } void main() { //Autodislike object oPC = GetEnteringObject(); if(GetIsPC(oPC) && !GetIsDM(oPC)) SetDislike(oPC); } |
Не, имхо если у вас ориентация на то, что есть несколько враждующих групп, то нало, чтобы дизы снять было нельзя...
Ходить в пати с врагами чтобы прокачацца... Не, это как-то не РПшно
Как я понял у них не РПшный шард, так что им пойдет .
Но все же лучше предоставить это в руки игроков и карать тех, кто собирается скачем компанией Вампиромов и Паладинов и идет качаЦЦа и бить мобоФФ. Тем более скажем вампира в тяжелой кирасе, со шлемом на башке трудно отличить от обычного воина, пусть игроки и мучаются.
У нас смешанный шард, сошлись на направлении РП ПвП Но второй скрипт, все же, подойдет больше, наверно
не знаю, насчет кривости и ресурсоемкости, но в общем пришел я к следующему
1) теория
берем набор скриптов AnDenix'a - Another yet Dynamic Arrays
на хартбите загоняем всех пс в массив
для кажлдого пс в массиве смотрим подрасу, если она равна заданной прогоняем еще раз через массив, выставляя дислайки
2) практика (на заданном в первом посте примере)
Neverwinter Script Source |
#include "inc_adarrays" void main() { object oMod = GetModule(); //удаляем существующий массив с игроками... oArrDel(oMod, "onlinePlayers"); //...и создаем новый object oPlayer = GetFirstPC(); while(GetIsObjectValid(oPlayer)) { oArrAdd(oMod, "onlinePlayers", oPlayer); oPlayer = GetNextPC(); } object oSource; object oTarget; string sSourceSubrace; string sTargetSubrace; int nNumPlayers = oArrLen(oMod, "onlinePlayers"); int i; for (i=1; i<=nNumPlayers; i++) { oSource = oArrGet(oMod, "onlinePlayers", i); sSourceSubrace = GetSubRace(oSource); //если у пс нужная подраса... if(sSourceSubrace=="Drow" || sSourceSubrace=="Duergar") { int n; //...выставляем дислайк "чужим" for ( n=1 ; n <= nNumPlayers ; n++ ) { oTarget = oArrGet(oMod, "onlinePlayers", n); sTargetSubrace = GetSubRace(oTarget); if(sTargetSubrace != "Drow" && sTargetSubrace != "Duergar") { SetPCDislike(oSource, oTarget); } } } } } |
Хм, интересная идея, а что в инклюде? Про "набор скриптов AnDenix'a - Another yet Dynamic Arrays", я ничего не слышал...
AnDenix Another Dynamic Arrays 0.2c
http://nwvault.ign.com/Files/scripts/data/1070834174562.shtml
На самом деле игроку не нужно ставить дизлайк для _всех_, достаточно только для тех, что на той-же локации. И вставить скрипт мне кажется разумным в onEnter локации, а не шарда.
В скрипте удобно использовать функцию GetNearestCreature():
Neverwinter Script Source |
object oEnter = GetEnteringObject(); if (!GetIsPC(oEnter)) return; object oNextPC; int i=2; do { oNextPC = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC,oEnter,i); i++; <тут проверка расы и выставление дизлайка если надо> } while(GetIsPC(oNextPC)); |
Тоже мысль, вот только замучаемся скрипты в локации распихивать
QUOTE |
Тоже мысль, вот только замучаемся скрипты в локации распихивать |
Нет, ну это понятно, что на все локи 1 скрипт, но локи, то сейчас без этого серипта, тоесть надо заходить в свойства каждой локи и вставлять скрипт, а у нас их болше двух сотен
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)