Buldog
Apr 20 2005, 19:53
Вот, писал для нашего шарда, конечно далеко от идеала, но работает, тут использованы коэффициенты для классов и для субрасс. Учтена смерть мобов от ловушек, за идею спасибо HitmanXXX. В партии экспа распределяется в зависимости от лвла чаров, которые были рядом с убитым мобом + штрафы за большой разброс по лвлам, для защиты от нубокача.
Состоит из 2х скриптов, инклюд:
inc_xpsystem_nd
Neverwinter Script Source |
/////////////////////////////////////////////// //*******************************************// //***********Created by Buldog***************// //*******************************************// //*******************************************// //**********Modified 20.04.2005**************// //*******************************************// ///////////////////////////////////////////////
//Classes coefficients const float FIGHTER_COEFFICIENT = 1.5; const float ARCANE_ARCHER_COEFFICIENT = 0.9; const float ASSASSIN_COEFFICIENT = 1.5; const float BARBARIAN_COEFFICIENT = 1.5; const float BARD_COEFFICIENT = 0.8; const float BLACKGUARD_COEFFICIENT = 1.2; const float CLERIC_COEFFICIENT = 0.8; const float DIVINE_CHAMPION_COEFFICIENT = 0.9; const float DRAGON_DISCIPLE_COEFFICIENT = 0.9; const float DRUID_COEFFICIENT = 1.4; const float DWARVEN_DEFENDER_COEFFICIENT = 1.3; const float HARPER_COEFFICIENT = 2.0; const float MONK_COEFFICIENT = 1.2; const float PALADIN_COEFFICIENT = 0.8; const float PALE_MASTER_COEFFICIENT = 0.8; const float RANGER_COEFFICIENT = 1.5; const float ROGUE_COEFFICIENT = 1.4; const float SHADOWDANCER_COEFFICIENT = 1.2; const float SHIFTER_COEFFICIENT = 1.3; const float SORCERER_COEFFICIENT = 0.4; const float WEAPON_MASTER_COEFFICIENT = 0.9; const float WIZARD_COEFFICIENT = 0.5;
//Subrace coefficients const int AIR_GENASI_COEFFICIENT = 1; const int EARTH_GENASI_COEFFICIENT = 1; const int WATER_GENASI_COEFFICIENT = 1; const int FIRE_GENASI_COEFFICIENT = 1; const int CELESTIAL_COEFFICIENT = 8; const int FIENDISH_COEFFICIENT = 8; const int HALF_CELESTIAL_COEFFICIENT = 7; const int HALF_FIEND_COEFFICIENT = 7; const int HALF_DRAGON_COEFFICIENT = 8; const int AASIMAR_COEFFICIENT = 1; const int TIEFLING_COEFFICIENT = 1; const int GHOSTWISE_HALFLING_COEFFICIENT = 1; const int LIGHTFOOT_HALFLING_COEFFICIENT = 1; const int STRONGHEART_HALFLING_COEFFICIENT = 1; const int GOLD_DWARF_COEFFICIENT = 1; const int SHIELD_DWARF_COEFFICIENT = 1; const int DUERGAR_COEFFICIENT = 2; const int DROW_COEFFICIENT = 2; const int WILD_ELF_COEFFICIENT = 1; const int MOON_ELF_COEFFICIENT = 1; const int SUN_ELF_COEFFICIENT = 1; const int WOOD_ELF_COEFFICIENT = 1; const int ROCK_GNOME_COEFFICIENT = 1; const int SVIRFNEBLIN_COEFFICIENT = 3;
//Calculate XP bonus. int BonusCalculation(object oPC, object oCreature=OBJECT_SELF);
//Return class coefficient for calculate XP. float ClassCoefficient(object oPC);
//Return oPC level with subrace coefficient for calculate XP. int LevelWithSubrace(object oPC);
//Calculate XP bonus if killer is trap. int TrapBonusCalkulation(object oPC, object oCreature=OBJECT_SELF);
float ClassCoefficient(object oPC) { int nClass, nPClass, nPLC = 0 ,nLC = 0, n;
float fCoeff = 0.0;
for(n = 1; n <= 3; n++) { nClass = GetClassByPosition(n, oPC); nLC = GetLevelByClass(nClass, oPC); if(nLC > nPLC) { nPClass = nClass; nPLC = nLC; }
if(nPClass == CLASS_TYPE_BARBARIAN) fCoeff = BARBARIAN_COEFFICIENT; if(nPClass == CLASS_TYPE_BARD) fCoeff = BARD_COEFFICIENT; if(nPClass == CLASS_TYPE_CLERIC) fCoeff = CLERIC_COEFFICIENT; if(nPClass == CLASS_TYPE_DRUID) fCoeff = DRUID_COEFFICIENT; if(nPClass == CLASS_TYPE_FIGHTER) fCoeff = FIGHTER_COEFFICIENT; if(nPClass == CLASS_TYPE_MONK) fCoeff = MONK_COEFFICIENT; if(nPClass == CLASS_TYPE_PALADIN) fCoeff = PALADIN_COEFFICIENT; if(nPClass == CLASS_TYPE_RANGER) fCoeff = RANGER_COEFFICIENT; if(nPClass == CLASS_TYPE_ROGUE) fCoeff = ROGUE_COEFFICIENT; if(nPClass == CLASS_TYPE_SORCERER) fCoeff = SORCERER_COEFFICIENT; if(nPClass == CLASS_TYPE_WIZARD) fCoeff = WIZARD_COEFFICIENT; if(nPClass == CLASS_TYPE_ARCANE_ARCHER) fCoeff = ARCANE_ARCHER_COEFFICIENT; if(nPClass == CLASS_TYPE_ASSASSIN) fCoeff = ASSASSIN_COEFFICIENT; if(nPClass == CLASS_TYPE_BLACKGUARD) fCoeff = BLACKGUARD_COEFFICIENT; if(nPClass == CLASS_TYPE_DIVINE_CHAMPION) fCoeff = DIVINE_CHAMPION_COEFFICIENT; if(nPClass == CLASS_TYPE_DRAGON_DISCIPLE) fCoeff = DRAGON_DISCIPLE_COEFFICIENT; if(nPClass == CLASS_TYPE_DWARVEN_DEFENDER) fCoeff = DWARVEN_DEFENDER_COEFFICIENT; if(nPClass == CLASS_TYPE_HARPER) fCoeff = HARPER_COEFFICIENT; if(nPClass == CLASS_TYPE_PALE_MASTER) fCoeff = PALE_MASTER_COEFFICIENT; if(nPClass == CLASS_TYPE_SHADOWDANCER) fCoeff = SHADOWDANCER_COEFFICIENT; if(nPClass == CLASS_TYPE_SHIFTER) fCoeff = SHIFTER_COEFFICIENT; if(nPClass == CLASS_TYPE_WEAPON_MASTER) fCoeff = WEAPON_MASTER_COEFFICIENT; }
//SendMessageToPC(oPC, "Class coefficient: " + FloatToString(fCoeff)); return fCoeff; }
int LevelWithSubrace(object oPC) { int nPCRace = GetRacialType(oPC); int nLvl = GetHitDice(oPC);
string sPCSubrace = GetStringUpperCase(GetSubRace(oPC));
if(sPCSubrace == "") return nLvl;
switch(nPCRace) { /* case RACIAL_TYPE_ALL: if(TestStringAgainstPattern("**AIR**", sPCSubrace)) nLvl = nLvl + AIR_GENASI_COEFFICIENT; if(TestStringAgainstPattern("**EARTH**", sPCSubrace)) nLvl = nLvl + EARTH_GENASI_COEFFICIENT; if(TestStringAgainstPattern("**WATER**", sPCSubrace)) nLvl = nLvl + WATER_GENASI_COEFFICIENT; if(TestStringAgainstPattern("**FIRE**", sPCSubrace)) nLvl = nLvl + FIRE_GENASI_COEFFICIENT; if(TestStringAgainstPattern("**CELESTIAL**", sPCSubrace)) nLvl = nLvl + CELESTIAL_COEFFICIENT; if(TestStringAgainstPattern("**FIENDISH**", sPCSubrace)) nLvl = nLvl + FIENDISH_COEFFICIENT; if(TestStringAgainstPattern("**HALF-CELESTIAL**", sPCSubrace)) nLvl = nLvl + HALF_CELESTIAL_COEFFICIENT; if(TestStringAgainstPattern("**HALF-FIEND**", sPCSubrace)|| TestStringAgainstPattern("**FIEND**", sPCSubrace)) nLvl = nLvl + HALF_FIEND_COEFFICIENT; if(TestStringAgainstPattern("**HALF-DRAGON**", sPCSubrace)|| TestStringAgainstPattern("**DRAGON**", sPCSubrace)) nLvl = nLvl + HALF_DRAGON_COEFFICIENT; break;*/ case RACIAL_TYPE_HUMAN: if(TestStringAgainstPattern("**AASIMAR**", sPCSubrace)) nLvl = nLvl + AASIMAR_COEFFICIENT; if(TestStringAgainstPattern("**TIEFLING**", sPCSubrace)) nLvl = nLvl + TIEFLING_COEFFICIENT; break; case RACIAL_TYPE_HALFORC: break; case RACIAL_TYPE_HALFELF: break; case RACIAL_TYPE_HALFLING: if(TestStringAgainstPattern("**GHOSTWISE**", sPCSubrace)) nLvl = nLvl + GHOSTWISE_HALFLING_COEFFICIENT; if(TestStringAgainstPattern("**LIGHTFOOT**", sPCSubrace)) nLvl = nLvl + LIGHTFOOT_HALFLING_COEFFICIENT; if(TestStringAgainstPattern("**STRONGHEART**", sPCSubrace)) nLvl = nLvl + STRONGHEART_HALFLING_COEFFICIENT; break; case RACIAL_TYPE_DWARF: if(TestStringAgainstPattern("**GOLD**", sPCSubrace)) nLvl = nLvl + GOLD_DWARF_COEFFICIENT; if(TestStringAgainstPattern("**SHIELD**", sPCSubrace)) nLvl = nLvl + SHIELD_DWARF_COEFFICIENT; if(TestStringAgainstPattern("**GRAY**", sPCSubrace) || TestStringAgainstPattern("**DUERGAR**", sPCSubrace)) nLvl = nLvl + DUERGAR_COEFFICIENT; break; case RACIAL_TYPE_ELF: if(TestStringAgainstPattern("**DROW**", sPCSubrace) || TestStringAgainstPattern("**DARK**", sPCSubrace)) nLvl = nLvl + DROW_COEFFICIENT; if(TestStringAgainstPattern("**WILD**", sPCSubrace)) nLvl = nLvl + WILD_ELF_COEFFICIENT; if(TestStringAgainstPattern("**MOON**", sPCSubrace)) nLvl = nLvl + MOON_ELF_COEFFICIENT; if(TestStringAgainstPattern("**SUN**", sPCSubrace)) nLvl = nLvl + SUN_ELF_COEFFICIENT; if(TestStringAgainstPattern("**WOOD**", sPCSubrace)) nLvl = nLvl + WOOD_ELF_COEFFICIENT; break; case RACIAL_TYPE_GNOME: if(TestStringAgainstPattern("**ROCK**", sPCSubrace)) nLvl = nLvl + ROCK_GNOME_COEFFICIENT; if(TestStringAgainstPattern("**DEEP**", sPCSubrace) || TestStringAgainstPattern("**SVIRFNEBLIN**", sPCSubrace)) nLvl = nLvl + SVIRFNEBLIN_COEFFICIENT; break; } //SendMessageToPC(oPC, "Subrace coefficient: " + IntToString(nLvl)); return nLvl; }
int BonusCalculation(object oPC, object oCreature=OBJECT_SELF) { object oPartyMember = GetFirstFactionMember(oPC, FALSE); object oPCArea, oCArea = GetArea(oCreature);
int nLvl, nDiff, nMaxLvl = 0, nPartyXP; int i = 0, j = 0, k, l = 0; int nLvlCreature = GetHitDice(oCreature);
float fCRCreature = GetChallengeRating(oCreature); float fDiff = (IntToFloat(nLvlCreature) + fCRCreature) * 0.5; float fPartyXP, fXPMod = 7.0f;
while(GetIsObjectValid(oPartyMember)) { nLvl = LevelWithSubrace(oPartyMember);
if(!GetIsPC(oPartyMember) && !GetIsDM(oPartyMember)) nLvl = GetHitDice(oPartyMember);
oPCArea = GetArea(oPartyMember); if(oCArea == oPCArea && GetDistanceBetween(oPartyMember, oCreature) <= 35.0f && !GetIsDM(oPartyMember) && GetCurrentHitPoints(oPartyMember) > 0) { if(GetIsPC(oPartyMember)) l++; if(nLvl > nMaxLvl && GetIsPC(oPartyMember)) nMaxLvl = nLvl; } oPartyMember = GetNextFactionMember(oPC, FALSE); }
fDiff = fDiff - IntToFloat(nMaxLvl);
nDiff = FloatToInt(fDiff); if (fDiff - IntToFloat(nDiff) >= 0.5) nDiff = nDiff + 1; if (nDiff > 12) nDiff = 12; if (nDiff < -6) nDiff = -6;
for (k = -6; k <= nDiff; k++) { j++; fPartyXP = fPartyXP + fXPMod * IntToFloat(j); }
if(l > 1) fPartyXP = fPartyXP * (1.2 * IntToFloat(l));
//SendMessageToPC(oPC, "Base bonus XP: " + IntToString(FloatToInt(fPartyXP)));
return FloatToInt(fPartyXP); }
int TrapBonusCalkulation(object oPC, object oCreature=OBJECT_SELF) { int nLvl = LevelWithSubrace(oPC), nDiff, k, j; int nLvlCreature = GetHitDice(oCreature);
float fCRCreature = GetChallengeRating(oCreature); float fDiff = (IntToFloat(nLvlCreature) + fCRCreature) * 0.5; float fXPMod = 7.0f, fXP;
fDiff = fDiff - IntToFloat(nLvl);
nDiff = FloatToInt(fDiff); if (fDiff - IntToFloat(nDiff) >= 0.5) nDiff = nDiff + 1; if (nDiff > 12) nDiff = 12; if (nDiff < -6) nDiff = -6;
for (k = -6; k <= nDiff; k++) { j++; fXP = fXP + fXPMod * IntToFloat(j); }
//SendMessageToPC(oPC, "Base bonus XP: " + IntToString(FloatToInt(fPartyXP)));
return FloatToInt(fXP); }
//void main(){} |
И основной скрипт, который раздает экспу:
nd_applyxp
Neverwinter Script Source |
/////////////////////////////////////////////// //*******************************************// //***********Created by Buldog***************// //*******************************************// //*******************************************// //**********Modified 20.04.2005**************// //*******************************************// ///////////////////////////////////////////////
#include "inc_xpsystem_nd" #include "nd_textcolor_inc"
int GetXPByLevel(int nLevel) { return (((nLevel - 1) * nLevel) / 2) * 1000; }
object CheckKiller(object oKiller) { //SendMessageToPC(oKiller, "Checking Monster Killer..."); if (!GetIsPC(oKiller)) { if (GetObjectType(oKiller) == OBJECT_TYPE_CREATURE) oKiller = GetMaster(oKiller); else { oKiller = GetTrapCreator(oKiller); SetLocalInt(oKiller, "TrapKiller", 1); //SendMessageToPC(oKiller, "Finded Trap Master!"); } } if (GetIsPC(oKiller) && !GetIsDM(oKiller)) return oKiller; return OBJECT_INVALID; }
void main() { object oPC = GetLastKiller();
oPC = CheckKiller(oPC);
if(oPC == OBJECT_INVALID) return;
if(GetIsDM(oPC)) return;
object oCreature = OBJECT_SELF; object oParty, oPArea, oCArea = GetArea(oCreature);
int i = 0, nPC = 0, nXP, nNewXP, nLevel, nPLevel = 0, nPCPLvl = 0, nAPLvl = 0; int nDelta; int nBonusXP = BonusCalculation(oPC, oCreature); int nMinXP = 10, nMaxXP = 1000;
float fClassCoeff, fNewXP;
if(GetLocalInt(oPC, "TrapKiller") == 1) { nBonusXP = TrapBonusCalkulation(oPC, oCreature); nNewXP = nBonusXP;
if(nNewXP < nMinXP) nNewXP = nMinXP; if(nNewXP > nMaxXP) nNewXP = nMaxXP;
//SendMessageToPC(oPC, "XP before apply class coefficient: " + IntToString(nNewXP));
fClassCoeff = ClassCoefficient(oParty); fNewXP = IntToFloat(nNewXP) * fClassCoeff;
if(GetXP(oPC) - GetXPByLevel(GetHitDice(oPC) + 1) > 0 && GetHitDice(oPC) < 40) { fNewXP = 0.0; SendMessageToPC(oParty, "You must to level up before getting new expierence points."); }
//SendMessageToPC(oPC, "You getting XP: " + FloatToString(fNewXP)); GiveXPToCreature(oPC, FloatToInt(fNewXP)); SendMessageToPC(oPC, C_LBLUE2 + GetName(oPC) + C_END + C_ORANGE + " óáèë " + GetName(oCreature) + C_END); DeleteLocalInt(oPC, "TrapKiller"); return; }
oParty = GetFirstFactionMember(oPC, FALSE); while(GetIsObjectValid(oParty)) { nLevel = LevelWithSubrace(oParty);
if(!GetIsPC(oParty) && !GetIsDM(oParty)) nLevel = GetHitDice(oParty);
//SendMessageToPC(oParty, "Your level with subrace: " + IntToString(nLevel));
oPArea = GetArea(oParty);
if(oCArea == oPArea && GetDistanceBetween(oParty, oCreature) <= 35.0f && !GetIsDM(oParty) && GetCurrentHitPoints(oParty) > 0) { i++; if(GetIsPC(oParty) && !GetIsDM(oParty)) { nPCPLvl = nPCPLvl + nLevel; nPC++; } nPLevel = nPLevel + nLevel; //SendMessageToPC(oParty, "Party level with your: " + IntToString(nPLevel) + // ", i: " + IntToString(i)); } oParty = GetNextFactionMember(oPC, FALSE); }
nAPLvl = nPCPLvl/nPC;
oParty = GetFirstFactionMember(oPC, FALSE); while(GetIsObjectValid(oParty)) { nLevel = LevelWithSubrace(oParty); oPArea = GetArea(oParty);
if(oPArea == oCArea && GetDistanceBetween(oParty, oCreature) <= 35.0f && GetIsPC(oParty) && !GetIsDM(oParty) && GetCurrentHitPoints(oParty) > 0) { nXP = GetXP(oParty);
if(i > 1) { nNewXP = nBonusXP / nPLevel * nLevel; } else { nNewXP = nBonusXP; }
if(nNewXP < nMinXP) nNewXP = nMinXP; if(nNewXP > nMaxXP) nNewXP = nMaxXP;
//SendMessageToPC(oPC, "XP before apply class coefficient: " + IntToString(nNewXP));
fClassCoeff = ClassCoefficient(oParty); fNewXP = IntToFloat(nNewXP) * fClassCoeff;
if(GetXP(oParty) - GetXPByLevel(GetHitDice(oParty) + 1) > 0 && GetHitDice(oParty) < 40) { fNewXP = 0.0; SendMessageToPC(oParty, "You must to level up before getting new expierence points."); }
//SendMessageToPC(oPC, "You getting XP: " + FloatToString(fNewXP));
if(nAPLvl > nLevel) nDelta = (nAPLvl - nLevel)/2; else nDelta = (nLevel - nAPLvl)/2;
if(nDelta < 1) nDelta = 1;
nNewXP = FloatToInt(fNewXP)/nDelta;
if(nNewXP < nMinXP) nNewXP = nMinXP; if(nNewXP > nMaxXP) nNewXP = nMaxXP;
GiveXPToCreature(oParty, nNewXP); } oParty = GetNextFactionMember(oPC, FALSE); } } |
В скрипт nw_c2_default7, или как там его, помещаешь строчку:
ExecuteScript("nd_applyxp", OBJECT_SELF);
А еще, маленький инклюдик для расскраски сообщений, идея _каа_, но сам инклюдик писал я сам

nd_textcolor_inc
Neverwinter Script Source |
/////////////////////////////////////////////// //*******************************************// //***********Created by Buldog***************// //*******************************************// ///////////////////////////////////////////////
const string C_WHITE = "<cþþþ>"; const string C_YELLOW = "<cþþ >"; const string C_RED = "<cþ >"; const string C_BLUE1 = "<c þ>"; const string C_BLUE2 = "<c zþ>"; const string C_LBLUE1 = "<c þþ>"; const string C_LBLUE2 = "<czþþ>"; const string C_GREEN = "<c þ >"; const string C_LILAC1 = "<cþ þ>"; const string C_LILAC2 = "<czzþ>"; const string C_ORANGE = "<cþz >"; const string C_VIOLET = "<cz þ>"; const string C_END = "</c>";
//void main(){} |
Buldog, ты даже не представляешь, как ты мне помог
И спасибки за оперативность
Добавлено в [mergetime]1114017506[/mergetime] Ну конечно же появилось несколько проблем
1. нужно ли раскомментировать в инклюдах
Neverwinter Script Source |
//void main(){} |
Если нет, то у меня не получается их скомпилить.
2.В скрипте раздающем экспу, компилятор просит меня "Дублировать выполнение функции(main)"
вобщем тоже не состовляется
Buldog
Apr 20 2005, 20:44
Если надо откомпилить, то раскоментируй, откомпилируй, а потом снова закоментируй, тока не забудь сохранить вариант с закоментированым майном, в инклюдах функции void main() быть не должно, потому они в инклюдах и закоментированы, из за етого и ошибка в основном скрипте.
Buldog все пасиба, работает
Добавлено в [mergetime]1114089959[/mergetime] Раз уж пошел разговор о системе опыта, может есть у кого нибудь и система лута?

Нет нет, я не настолько ленивый, я написал собственную, но к сожелению она очень большая(2000 строк в скрипте, а всего их 3)
Так что,для меня этот вопрос остается открытым
Алексашка
Apr 22 2005, 20:20
Сделал себе систему крафта.(Содрал из Левора

) 2da таблицу сделал свою, скрипт содрал у Baalа

Надеюсь божественная аватара не будет сильно гневаться на скромного священника.

У самого ума не хватит такой скрипт написать. Все получилось нормально. Только вместо названий вещей и компонентов пишуться ярлыки. (В леворе кстати такое имело место быть. С вещами имеющими два тега). Подскажите из-за чего такое происходит.
там глянь, в инклюде есть работа с обхектом одним..это вроде поинт. Он у тебя есть в модуле?
(просто имя вещи находится так: она создается в том поинте и берется ее имя, а вещь удаляется. Иначе, если нету вещи или поинта, то берется сам резреф....кажись так)
Алексашка
Apr 25 2005, 18:51
QUOTE (Lex @ Apr 23 2005, 06:27) |
там глянь, в инклюде есть работа с обхектом одним..это вроде поинт. Он у тебя есть в модуле? (просто имя вещи находится так: она создается в том поинте и берется ее имя, а вещь удаляется. Иначе, если нету вещи или поинта, то берется сам резреф....кажись так) |

Спасибо Lex! Я просто не поставил точку WP, в которой вещи креатятся и дестроятся. Все работает, все ОК! Спасибо за теорию. Мне ее временами катастрофически не хватает.

Я гуманитарий, а не программист. (т.е. программер

)
Появилась идея сделать что-то вроде фильтра на нецензурные выражения.
Смысл такой: когда игрок выражается

то получает штраф и предупреждение автоматически. Должен быть какой-то словарь, куда надо вписать все

.Вот только не знаю с какого конца начать. Надеюсь, что поможете
Tiger Greyhawk
Apr 26 2005, 03:54
to Лито:
swearfilter.2da и namefilter.2da
ссылка на описание значений Но это, насколько я понял Leon_PRO, будет работать только в "chatroom" (чат до игры), хотя это надо проверить. На экране у говорящего отображается, а как будет у других

.
Можно сделать путем отслеживания произнесенных слов (как например в "
Русская версия KPBS (система банкинга и биржи) ссылка" в переводе Аваддона, см. его подпись), но это, по моему, будет только после произнесения слова.

т.е. можно сделать на автоматический штраф и предупреждение, но не катит как фильтр. Хотя, это все только предположения.
-fenix-
Apr 28 2005, 18:42
Люди как сделать полноценного оруженосца. И можно сделать, чтобы с персом бегало 2 оруженосца, а не один?
И как сделать портал, который в официальной компании и модах. Юзаешь камень призыва и тебя переносит к порталу, заходишь в портал и тебя переносит в последнее место использования камня.
Buldog
Apr 28 2005, 19:03
По поводу камня с возвратом. Создаешь нужный тебе предмет и даешь ему какой то тэг, при этом в предмет добавь свойство в русской версии "Только своя уникальная сила", прозьба не смеяться, по английски я понимаю плохо, поэтому использую руссифицированный тулсет, как это свойство по английски звучит я не в курсе.
В модуле в OnActivateItem помещаешь скрипт:
Neverwinter Script Source |
void main() { object oUser = GetItemActivator(); object oStone = GetItemActivated(); object oTarget = GetObjectByTag("ST_" + GetTag(oStone));
SetLocalLocation(oUser, "ReturnLocation", GetLocation(oUser));
AssignCommand(oUser, ClearAllActions()); DelayCommand(1.0f, AssignCommand(oUser, ActionJumpToLocation(GetLocation(oTarget)))); } |
Далее в нужном месте создаешь вэйпоинт с тэгом ST_+тэг предмета и поблизости портал. В OnUsed портала вставляешь скрипт:
Neverwinter Script Source |
void main() { object oUser = GetLastUsedBy();
AssignCommand(oUser, ClearAllActions()); DelayCommand(1.0f, AssignCommand(oUser, ActionJumpToLocation(GetLocalLocation(oUser, "ReturnLocation")))); } |
Сам не проверял, но должно работать
-fenix-
Apr 28 2005, 19:33
Buldog спасибо, попробую.
RiPPeR
Apr 28 2005, 19:37
QUOTE |
Neverwinter Script Source | void main() { object oUser = GetItemActivator(); object oStone = GetItemActivated(); object oTarget = GetObjectByTag("ST_" + GetTag(oStone));
SetLocalLocation(oUser, "ReturnLocation", GetLocation(oUser));
AssignCommand(oUser, ClearAllActions()); DelayCommand(1.0f, AssignCommand(oUser, ActionJumpToLocation(GetLocation(oTarget)))); } |
|
Дык так будет для любой активации уник повера предмета одинаковое дейтсвие, проверку тага actived предмета нужно сделать, а лучше res-ref'а.
Добавлено в [mergetime]1114706618[/mergetime]
Neverwinter Script Source |
void main() { object oPC = GetItemActivator(); object oItem = GetItemActivated(); string sResRef = GetResRef(oItem); string sStoneResRef = "stone"; //Сюда рес-реф камня поставишь
if (sResRef == sStoneResRef) { object oTarget = GetWaypointByTag("WP_" + sStoneResRef);
SetLocalLocation(oPC, "ReturnLocation", GetLocation(oPC));
AssignCommand(oPC, ClearAllActions()); DelayCommand(1.0f, AssignCommand(oPC, ActionJumpToLocation(GetLocation(oTarget)))); } } |
При активации камня (или любого другого предмета) с заданным рес-рефом, телепортирует его к вэйпоинту с тагом: WP_+рес-реф камня. В скрипте между " " своё название подставь и все.
-fenix-
Apr 28 2005, 20:34
Buldog все работает спасибо!
RiPPeR - поправлю как сказал, тоже спасибо!
А про оруженосца кто знает?????????
Здравствуйте.
Подскажите пожалуйста, можно ли отключить (запретить использовать) кнопку save character, которая экспортирует персонажа в localvault и как это сделать?
-fenix-
Apr 28 2005, 21:19
У меня вообще оруженосец есть. Я его сделал из Томи, путем пластической операции и промывки разговора. Только он сует мне свой контракт (тег - NW_HEN_GALPERS, ResRes - hen_galpers002). В его скриптах ни тега, ни ResRefа не нашел. И еще инвентарь у него от Томи остался.
Алексашка
Apr 29 2005, 19:43
QUOTE (-fenix- @ Apr 28 2005, 21:19) |
У меня вообще оруженосец есть. Я его сделал из Томи, путем пластической операции и промывки разговора. Только он сует мне свой контракт (тег - NW_HEN_GALPERS, ResRes - hen_galpers002). В его скриптах ни тега, ни ResRefа не нашел. И еще инвентарь у него от Томи остался. |
Ты имеешь ввиду невозможность зайти в его инвентарь? Могу тебя порадовать, еще одним сюрпризом в будущем. Когда ты будешь повышать уровень своему"Томи" можешь ненароком остаться вообще без оруженосца

. Выкинь этого персонажа и сделай нового. Просто содаешь нового перса, с теми параметрами которые тебе нужны, затем заходишь в скрипты и меняешь все, стоящие там по умолчанию, на скрипты оруженосца из первого или вторго аддона. Смотря какой у тебя стоит. Создаешь ему диалог со скриптом присоединения и оруженосец готов. Скрипты по памяти не напишу, а тулсета рядом нет.
Алексашка
Apr 29 2005, 19:45
QUOTE (-fenix- @ Apr 28 2005, 21:19) |
Только он сует мне свой контракт (тег - NW_HEN_GALPERS, ResRes - hen_galpers002). В его скриптах ни тега, ни ResRefа не нашел. |
Контракт прописан в диалоге в строке присоединения.
QUOTE (Zik @ Apr 28 2005, 23:40) |
Подскажите пожалуйста, можно ли отключить (запретить использовать) кнопку save character, которая экспортирует персонажа в localvault и как это сделать? |
Боюсь что никак. Если только вообще запретить панель сэйва.
-fenix-
Apr 30 2005, 16:58
Самого оруженосца уже сам сделал. А вот за контракт ОГРОМНОЕ СПАСИБО!
Привет всем, у меня вот такой вопрос : я вот компонентную магию делаю, заклы переписать не проблема. Вот в чем проблема, так это в том что я не знаю как она устанавливаеться, т. е. как заставить работать переписаные заклы?
Я не прошу скриптов, только алгоритм куда что вставлять
Эм..там в spells.2da написано, какой скрипт какой закл обрабатывает по моему. Те если тебе надо закл поменять, то тебе эти скрипты и надо ковырять..или я что-то не догоняю?
Все спелы обрабатыватся соответствующими скриптами, причем, что бы узнать какой скрипт какой спелл обрабатывает вовсе не обязательно лезть в spells.2da, у большинства скриптов имя совпадает с названием спела. А что бы посмотреть скрипты, просто при открытии скрипта поставь пометку, что бы показывались не только скрипты модуля, но и дефолтные скрпты НВНа.
Не это все понятно, я про то как заставить переписаные спеллы работать.Пример, вот я переписал скрипт с молнией , добавил, скажем, компонент. Куда его надо поставить, или в каком скрипте ссылку на него сделать?

Замучился, порожаюсь как люди разбираються....
У самого были вопросы с компоненткой. В ту пору мне dumbo все разжевал

Сейчас попробую я.
Делается все дело с помощью биотваревской системы spell-hook
Ставь на модуль переменную типа string, с именем X2_S_UD_SPELLSCRIPT. стоимость пременной = названию скрипта, в котором ты будешь дополнять спеллы.
Как поставить переменную?
Св-ва модуля -> Улучшенный(Advanced) -> переменные.
Вот пример компонентного закла.
скрипт называется m_my_spell.
Neverwinter Script Source |
void main() { object oPC = OBJECT_SELF; object oTarget = GetSpellTargetObject(); //в кого пуляем? object oItem = GetSpellCastItem(); //а если кастуем с предмета? int nSpell = GetSpellId(); //переменная, которая определяет какой именно спелл кастуется switch (nSpell)
{
case SPELL_FIREBALL: //на какие собственно спеллы компонент? В данном случае на фаэрболлы и фаэрбрэнды case SPELL_FIREBRAND: case SPELL_DELAYED_BLAST_FIREBALL: if (GetIsObjectValid(oItem)) //если указанные выше спеллы кастуются с предмета(амулет, свиток и т.д.). Останавливаем скрипт. { break; }
if ((HasItem(oPC,"sera") == FALSE) && (GetIsDM(oPC) == FALSE)) //если у кастующего нет компонента с тэгом sera - остановить спелл.Если кастер - ДМ, забиваем на проверку { SetModuleOverrideSpellScriptFinished(); SendMessageToPC(OBJECT_SELF, "У вас нет необходимых компонентов!!"); } else { DestroyObject(GetItemPossessedBy(oPC,"sera")); //забираем серу } break; |
скрипт называется m_my_spell.
Значит переменная на модуле будет выглядеть так:
имя: X2_S_UD_SPELLSCRIPT тип: string стоимость: m_my_spell
Я попробую в выходные(на неделе занят

). Спасибо
Мефистофель
May 6 2005, 01:13
Помогите пожалуйста с этим скриптом он не работает.
Neverwinter Script Source |
void main() { object oPC = GetPCItemLastEquippedBy(); object oItem = GetPCItemLastEquipped(); if (GetTag(oItem) == "mg_it_ringghost") { effect E = EffectCutsceneGhost(); E = EffectLinkEffects(EffectEthereal(),E); ApplyEffectToObject(DURATION_TYPE_PERMANENT,E,oPC); } } |
на onPlayerUnEquipItem()
Neverwinter Script Source |
void FindAndRemoveGhostEffect(object O) { effect e = GetFirstEffect(O); while (GetIsEffectValid(e)) { if (GetEffectType(e) == EFFECT_TYPE_CUTSCENEGHOST) RemoveEffect(O,e); if (GetEffectType(e) == EFFECT_TYPE_ETHEREAL) RemoveEffect(O,e); e = GetNextEffect(O); } void main() { object oPC = GetPCItemLastUnequippedBy(); object oItem = GetPCItemLastUnequipped(); // кольцо духа if (GetTag(oItem) == "mg_it_ringghost") { FindAndRemoveGhostEffect(oPC); } |
и возможно ли его использовать в СоУ, если да то на какие слоты, ставить.
Добавлено в [mergetime]1115331269[/mergetime]
Ой Забыл, скрипт Lex(а).
QUOTE |
Ой Забыл, скрипт Lex(а). |
то Мефистофель - это скрипт Мидгарда (если не ошибаюсь написаный каа)
к нему нужно кольцо духа (тэг предмета("mg_it_ringghost") )- кустомный итем ( кстати создано это было отнюдь не для применения широкими масами простых игроков, а для весьма специальных целей), так что не рекомендую применять это как общепользовательский итем для всех играющих на шарде, ибо он дает слишком уж большую плюшку
Лито, огромное спасибо! Попробовал с переписаным заклом фаерболла - просто сказка
Мефистофель
May 7 2005, 00:25
Исходя, из вами сказанного я не понял одного, зачем тогда этот скрипт был выставлен, в соответствующей теме?
TwilightCount
May 7 2005, 00:51
Мефистофель, зачем тебе этот скрипт?
Этот скрипт позволяет при надетом кольце игроку проходить через других игроков
Если хочешь использовать, создай кольцо с тэгом mg_it_ringghost.
Можно ли использовать в СОУ, зависит по-мойму от патча. И вообще юзай сразу СОУ+ХТОУ.
Мефистофель
May 7 2005, 01:42
TwilightCount, блин я сюзал бы да вот незнаю от куда. Мне скрипт очень нужен я делаю Lord of Ring.
В СОУ не тех слотов куда скрипы эти ставить надо, да и Компилятор ошибку выдаёт во втором скрипте, вот и спросил чё исправить надо.
У меня вопрос :
Я вот в переписаном спелле блесс хочу сделать проверку на класс и взависимости от него на предмет фокуса в левой руке.
Вот значит получаеться все слишком не эстетично, по обьему
Можно ли как то, скажем, в скрипте закла, при проверке отправить на другой скрипт, на котором стоит проверка, и полученый результат использовать в скрипте закла ?
Или короче

я хочу сделать проверку класса и взависимости от него - предмета в слоте
Выше Лито писал про компонентную магию, тебе тот же скрипт подойдет, только вместо компонентов проверяешь то, что тебе нужно.
Scaled, просто добавь в скрипте spell-hook(ну это в котором ты добавлял компоненты на фаэрболл

), case блесс.
Все это будет выглядеть примерно так:
Neverwinter Script Source |
void main() { object oPC = OBJECT_SELF; object oTarget = GetSpellTargetObject(); object oItem = GetSpellCastItem(); int nSpell = GetSpellId(); switch (nSpell)
{
case SPELL_FIREBALL: case SPELL_FIREBRAND: case SPELL_DELAYED_BLAST_FIREBALL: if (GetIsObjectValid(oItem)) { break; } if ((HasItem(oPC,"sera") == FALSE) && (GetIsDM(oPC) == FALSE)){ SetModuleOverrideSpellScriptFinished(); SendMessageToPC(OBJECT_SELF, "У вас нет необходимых компонентов!!"); } else { DestroyObject(GetItemPossessedBy(oPC,"sera")); у } break; case SPELL_BLESS: //тут пишешь свою проверку  break; } |
Все
Здравствуйте!
Меня давно мучает один вопрос, ответ на который я так и не нашел. Наверняка эта тема уже поднималась, но все-таки:
Я хочу добиться следующего эффекта:
Представьте себе, встречаете вы мирного к вам NPC, нападаете на него (через меню с правой мыши), и как только
его здоровье (NPC то есть) доходит до, к примеру, единицы, он падает на землю, его отношение к вам
становится снова нейтральным. Через нек. время он встаёт, садится отдыхать и т.п.. Однако если будучи
поверженным (лежа на земле) он будет вновь вами атакован, то умрёт окончательно с первого вашего удара (эдакое "добивание").
Можно в OnDamage моба прописать проверку, что если жизней меньше какого то количества, то происходит все, что ты описал, но эффективней будет прописать в OnDeath, сделать, что бы НПС не умирал, а падал с 1 HP, а потом отдыхал, восстанавливался и т.д.
Scaled
May 10 2005, 11:29
Эх ступил я с вопросом, но все равно спасибо
Вот еще вопрос, есть такой хороший скрипт - температура, Лито писал уже про ето
Что когда выходишь из локи он продолжает работать, как остановить его?
Приведенный там скрипт остановки не работает.
Эм... я выкладывал его поправленную версию в той теме, где с Лито про это говорили. Там все работает.
Jammed
May 11 2005, 20:36
Понимаешь, Buldog, может случиться такое, что у непися останется, допустим, 20хп, а я долбану его, к примеру, критическим на 60хп и у него сразу станет 0хп, минуя единицу.
Jammed, Разве нельзя написать проверку, чтобы если хиты становились меньше 1, существо хилилось?
QUOTE (Jammed @ May 9 2005, 21:29) |
Здравствуйте! Меня давно мучает один вопрос, ответ на который я так и не нашел. Наверняка эта тема уже поднималась, но все-таки:
Я хочу добиться следующего эффекта: Представьте себе, встречаете вы мирного к вам NPC, нападаете на него (через меню с правой мыши), и как только его здоровье (NPC то есть) доходит до, к примеру, единицы, он падает на землю, его отношение к вам становится снова нейтральным. Через нек. время он встаёт, садится отдыхать и т.п.. Однако если будучи поверженным (лежа на земле) он будет вновь вами атакован, то умрёт окончательно с первого вашего удара (эдакое "добивание"). |
Посмотри вот это
Subdual Damage, примерно что ты описал, но для игроков. Можно расширить и на неписей
Buldog
May 11 2005, 23:50
QUOTE (Jammed @ May 11 2005, 21:36) |
Понимаешь, Buldog, может случиться такое, что у непися останется, допустим, 20хп, а я долбану его, к примеру, критическим на 60хп и у него сразу станет 0хп, минуя единицу. |
Прочий внимательней мой пост, я же написал, что эффективней это сделать через не ОнДамаг, а ОнДеас, просто при смерти не убиваешь НПС, а он падает с 1 НР, правда там тогда надо пудет как то придумывать, что бы его добить можно было, но в принципе сразу он уже не помрет.
если было 20 и дамаг на 60, то сразу труп. Но событие на дамаг произойдет..так что имхо стоит его юзать и можно обработать попробовать. А может и не выйдет нифига.
ибо есть еще такой вариант, как магия смерти. В этом случае смерть не должна "откладываться" имхо
Добавлено в [mergetime]1115847072[/mergetime]
зы: сам в ближайшее время буду себе такую схему писать.
Buldog
May 12 2005, 00:38
А еще бывает Девастейт, ну это если эпики используются

Еще у монка дрожащая ладонь, смертельные сники у Ассасина, и если с заклинаниями можно бороться, прописать при провале спаса на смерть, что бы наносился дамаг какой то, то эти фиты правятся только хаками...
Scaled
May 12 2005, 11:45
Вот у меня еще вопосы:
1. Хочу сделать чтобы при попытке написания свитка, требовались компоненты: перо и свиток.
Как это сделать? в 2да лезть?
2. Как при смерти табличку респаун ор дай вызывать?интересно как в ней написать что мол нажмешь кнопку респа и потеряешь 50 хр за левел.(в табличке)
3. Вот я на форуме нашел скрипт респауна в сундуке фиксированой шмотки, как его установить? Я попробывал создать существо в закрытой локе и на ОнСпаун повесить этот скрип - не фига.
П.С.
Lex спасибо за темперературный скрипт - классная штука.
Buldog
May 12 2005, 12:42
Табличка при смерти вызывается вот этой функцией:
Neverwinter Script Source |
// Spawn in the Death GUI. // The default (as defined by BioWare) can be spawned in by PopUpGUIPanel, but // if you want to turn off the "Respawn" or "Wait for Help" buttons, this is the // function to use. // - oPC // - bRespawnButtonEnabled: if this is TRUE, the "Respawn" button will be enabled // on the Death GUI. // - bWaitForHelpButtonEnabled: if this is TRUE, the "Wait For Help" button will // be enabled on the Death GUI. // - nHelpStringReference // - sHelpString void PopUpDeathGUIPanel(object oPC, int bRespawnButtonEnabled=TRUE, int bWaitForHelpButtonEnabled=TRUE, int nHelpStringReference=0, string sHelpString="") |
В OnPlayerDeath ее прописываешь, а там, где sHelpString, я так понимаю, сам ничего не писал там

, вписываешь нужный тебе текст.
QUOTE (Scaled @ May 12 2005, 12:45) |
Lex спасибо за темперературный скрипт - классная штука. |
это скрипт Milez'а, там же написано. Я просто со старого форума его перенес.
Может где есть,но я не нашел. такой баг: когда выходишь в полиморфе, а затем снова заходишь на сервер, кол-во хит-поинтов не сокращается, а так и остается в размере полиморфа. Ну можно еще 10 раз перекинутся и набить себе до 10к хитов.
Вопрос: Кто знает как лечится?
Ответить знающих прошу срочно, народ уже эксплуатирует, а самому разбиратся долго
Buldog
May 12 2005, 18:30
Вот, одновременно и HP вернет и фиксит баг с перезаходом в полиморфе, когда у сорка становится много много спелов после перезахода в полиморфе

Neverwinter Script Source |
void RemoveSpells(object oPC) { int i, k, l; for(i = 0; i <= 805; i++) { k = GetHasSpell(i, oPC); if(k) { for(l = 0; l < k; l++) { DecrementRemainingSpellUses(oPC, i); } } } } |
Neverwinter Script Source |
int i; int nCHP = GetCurrentHitPoints(oPC); int nMHP = GetMaxHitPoints(oPC); effect eDmg = EffectDamage(nCHP - nMHP);
effect eEffect = GetFirstEffect(oPC); while(GetIsEffectValid(eEffect)) { if(GetEffectType(eEffect) == EFFECT_TYPE_POLYMORPH) { RemoveEffect(oPC, eEffect); if(nCHP > nMHP) ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, oPC); DelayCommand(1.0f, RemoveSpells(oPC)); SendMessageToPC(oPC, "Вот тебе за багоюз!"); break; } eEffect = GetNextEffect(oPC); } |
Это в OnClientEnter модуля.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.