QUOTE (Zirrex @ Jul 6 2005, 01:50) |
з.ы. эх, мне бы кто подсказал по выше описанным скриптам иное решение проблемы. |
Neverwinter Script Source |
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); } } void RemoveingBadEffect(object oPlayer) { effect eBad = GetFirstEffect(oPlayer); while(GetIsEffectValid(eBad)) { if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS || GetEffectType(eBad) == EFFECT_TYPE_DEAF || GetEffectType(eBad) == EFFECT_TYPE_PARALYZE || GetEffectType(eBad) == EFFECT_TYPE_POISON || GetEffectType(eBad) == EFFECT_TYPE_SLOW || GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS || GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL) { Debug("RemoveEffect"); RemoveEffect(oPlayer, eBad); } eBad = GetNextEffect(oPlayer); } //Fire cast spell at event for the specified target SignalEvent(oPlayer, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE)); } |
Neverwinter Script Source |
void DebugObject(object oObject) { string sTag = GetTag(oObject); string sResRef = GetResRef(oObject); string sName = GetName(oObject); Debug ("TAG = "+sTag+", ResRef = "+sResRef+", Name = "+sName+"."); } void main() { object oItemCr = GetFirstItemInInventory(oPC); while(GetIsObjectValid(oItemCr)) { DebugObject(oPC); oItemCr = GetNextItemInInventory(oPC); } } |
Neverwinter Script Source |
for (i = 14; i < 18; i++) { oItem = GetItemInSlot(i, oPC); if (GetIsObjectValid(oItem)) DestroyObject(oItem); } |
Neverwinter Script Source |
void main() { object oPC = GetPCSpeaker(); object oBarmen = GetObjectByTag("OBJECT_SELF"); object oVor = GetObjectByTag("VOR"); object oSunduk = GetObjectByTag("sunduk"); //============================================================================== object oWP = GetWaypointByTag("WP_VOR_01"); object oWP_PC_1 = GetWaypointByTag("WP_PC_1"); //============================================================================== object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPC); object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPC); object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPC); object oHenchman = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC); object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC); //============================================================================== effect eCutInv = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY); effect eCutPar = EffectParalyze(); //============================================================================== SetLocalInt(oPC, "CUT_SCEN_03", TRUE); SetLocalLocation(oPC, "START_POINT", GetLocation(oPC)); AssignCommand(oBarmen, ActionPauseConversation()); AssignCommand(oVor, ClearAllActions()); AssignCommand(oVor, ActionJumpToObject(oWP)); FadeToBlack(oPC, FADE_SPEED_FASTEST); AssignCommand(oPC, ClearAllActions()); SetCutsceneMode(oPC); SetAILevel(oVor, AI_LEVEL_HIGH); //============================================================================== ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oAnimal, 13.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oAnimal, 13.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oDominated, 13.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oDominated, 13.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oFamiliar, 13.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oFamiliar, 13.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oHenchman, 13.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oHenchman, 13.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutInv, oSummoned, 13.5); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eCutPar, oSummoned, 13.5); //============================================================================== DelayCommand(1.0, AssignCommand(oPC, SetCameraFacing(100.0, 20.0, 30.0, CAMERA_TRANSITION_TYPE_SNAP))); DelayCommand(1.5, FadeFromBlack(oPC, FADE_SPEED_MEDIUM)); DelayCommand(2.0, AssignCommand(oPC, ClearAllActions())); DelayCommand(2.5, AssignCommand(oVor, ClearAllActions())); DelayCommand(3.0, AssignCommand(oVor, SpeakString("Åùå îäèí ñóíäó÷îê"))); DelayCommand(4.0, AssignCommand(oVor, ActionMoveToObject(oSunduk))); DelayCommand(7.0, AssignCommand(oVor, ActionDoCommand(SetFacingPoint(GetPosition (oSunduk))))); DelayCommand(8.0, AssignCommand(oVor, ActionPlayAnimation( ANIMATION_LOOPING_GET_MID,9.0, 1.0))); DelayCommand(9.0, AssignCommand(oSunduk,ActionPlayAnimation( ANIMATION_PLACEABLE_OPEN,1.0))); DelayCommand(10.0, AssignCommand(oVor, SpeakString("Âîò ýòî êóø, óñå, ïîðà ñâàëèâàòü"))); DelayCommand(12.0, AssignCommand(oVor,ActionPlayAnimation (ANIMATION_LOOPING_GET_MID,9.0, 1.0))); DelayCommand(12.5, AssignCommand(oSunduk, ActionPlayAnimation( ANIMATION_PLACEABLE_CLOSE,1.0))); DelayCommand(14.0, AssignCommand(oVor, ActionMoveToObject(oBarmen, TRUE))); DelayCommand(15.0, AssignCommand(oVor, ActionAttack(oBarmen, FALSE))); DelayCommand(20.0, AssignCommand(oPC, ClearAllActions())); DelayCommand(24.5, AssignCommand(oBarmen, ActionResumeConversation())); DelayCommand(25.0, AssignCommand(oPC, SetCutsceneMode(oPC, FALSE))); } |
Neverwinter Script Source |
DelayCommand(14.5, AssignCommand(oVor, AdjustReputation(OBarmen, oVor, -90))); DelayCommand(14.5, AssignCommand(oBarmen, AdjustReputation(OVor, oBarmen, -90))); |
QUOTE (-fenix- @ Jul 6 2005, 10:58) | ||
|
QUOTE (dumbo @ Jul 6 2005, 18:55) |
это что за...?! |
CODE |
Damage Reduction: +3 Soak 30 Damage Damage Vulnerability: Electrical 50% Damage Vulnerability Immunity: Miscellaneous: Critical Hits Immunity: Miscellaneous: Death Magic Immunity: Miscellaneous: Disease Immunity: Miscellaneous: Level/Ability Drain Immunity: Miscellaneous: Mind-Affecting Spells Immunity: Miscellaneous: Paralysis Immunity: Miscellaneous: Poison Immunity: Miscellaneous: Sneak Attack |
Neverwinter Script Source |
object oBarmen = OBJECT_SELF; |
Neverwinter Script Source |
DelayCommand(6.0, WalkWayPoints()); |
QUOTE (Zirrex @ Jul 6 2005, 21:46) |
Я же не хочу, чтобы каждый входящий персонаж в полиморфе лишался вещей. |
Neverwinter Script Source |
int INVENTORY_SLOT_CWEAPON_L = 14; int INVENTORY_SLOT_CWEAPON_R = 15; int INVENTORY_SLOT_CWEAPON_B = 16; int INVENTORY_SLOT_CARMOUR = 17; |
QUOTE (Zirrex @ Jul 6 2005, 21:46) |
Может все-таки стоит проверять только невидимые? |
QUOTE |
Я только не совсем понимаю, что значит они у тебя дергаются, плохо дерутся? Или перемещаются между точками до начала боя дерганно? |
Neverwinter Script Source |
void RemovePolymorth(object oPC) { // Посмотреть первый эффект effect eEffect = GetFirstEffect(oPC); while (GetIsEffectValid(eEffect)) { // Если есть эффект полиморфа на игроке, то продолжить if (GetEffectType(eEffect) == EFFECT_TYPE_POLYMORPH) { int i; for (i = 14; i < 18 ; i++) { object oEquip = GetItemInSlot(i,oPC); if (GetIsObjectValid(oEquip)) DestroyObject(oEquip); } // Удалить эффект полиморфа с игрока RemoveEffect(oPC, eEffect); break; } // Посмотреть следующий эффект eEffect = GetNextEffect(oPC); } } |
Neverwinter Script Source |
// Поискать в радиусе жертвы живое существо object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 40.0f, GetLocation(oKiller), TRUE, OBJECT_TYPE_CREATURE); // Если живое существо есть, и это не игрок, продолжить while ((oTarget != OBJECT_INVALID) && !GetIsPC(oTarget)) { // Если фракция найденного существа 'Стражник', продолжить if (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oTarget)) { // Очистить действие игрока и НПС AssignCommand(oTarget, ClearAllActions(TRUE)); AssignCommand(oKiller, ClearAllActions(TRUE)); // Стражник подбегает к игроку AssignCommand(oTarget, ActionForceMoveToObject(oKiller, TRUE, 2.0f, 5.0f)); // Стражник говорит фразу игроку в общий канал AssignCommand(oTarget, ActionDoCommand(ActionSpeakString("Эй, подожди, у меня к тебе неотложный разговор!", TALKVOLUME_TALK))); // Стражник открывает игроку диалог AssignCommand(oTarget, ActionDoCommand(ActionStartConversation(oKiller, "am_carma_system", TRUE))); break; } // Поискать в радиусе жертвы еще живое существо oTarget = GetNextObjectInShape(SHAPE_SPHERE, 40.0f, GetLocation(oKiller), TRUE, OBJECT_TYPE_CREATURE); } |
QUOTE (Zirrex @ Jul 9 2005, 15:26) |
Гм... сейчас протестировал без удаления невидимых предметов, все снимается |
Neverwinter Script Source |
object oDefender = GetObjectByTag("tag kakogo-libo defendera"); ... if (GetFactionEqual(oDefender, oTarget)) { // oTarget тоже дефендер } |
Neverwinter Script Source |
AssignCommand(oTarget, ActionSpeakString("Эй, подожди, у меня к тебе неотложный разговор!", TALKVOLUME_TALK)); /* Либо как внизу ставь не актион в стэк */ // AssignCommand(oTarget, ActionDoCommand(SpeakString("Эй, подожди, у меня к тебе неотложный разговор!", TALKVOLUME_TALK))); // Стражник открывает игроку диалог AssignCommand(oTarget, ActionStartConversation(oKiller, "am_carma_system", TRUE)); |
Neverwinter Script Source |
// Поискать в радиусе жертвы живое существо object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 40.0f, GetLocation(oPlayer), TRUE, OBJECT_TYPE_CREATURE); if ((GetLocalInt(oSpirit,"Carma_" + sID) < -200) && (GetLocalInt(oPlayer, "PkKiller") != 1) && (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oPlayer) > 10)) // Если живое существо есть, то продолжить while ((oTarget != OBJECT_INVALID) && !GetIsPC(oTarget)) { if (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oTarget) && !IsInConversation(oTarget) && !GetIsInCombat(oTarget)) { // Очистить действие игрока и НПС AssignCommand(oTarget, ClearAllActions(TRUE)); AssignCommand(oPlayer, ClearAllActions(TRUE)); // Изменение переменной 'PkKiller' на 1 if (GetLocalInt(oPlayer, "PkKiller") == 1) { SetLocalInt(oPlayer, "PkKiller", 1); } // Стражник подбегает к игроку AssignCommand(oTarget, ActionForceMoveToObject(oPlayer, TRUE, 2.0f, 5.0f)); // Стражник говорит фразу игроку в общий канал AssignCommand(oTarget, ActionSpeakString("Эй, подожди, у меня к тебе неотложный разговор!",TALKVOLUME_TALK)); // Стражник открывает игроку диалог AssignCommand(oTarget, ActionStartConversation(oPlayer, "am_carma_system", TRUE)); break; } // Поискать в радиусе жертвы еще живое существо oTarget = GetNextObjectInShape(SHAPE_SPHERE, 40.0f, GetLocation(oPlayer), TRUE, OBJECT_TYPE_CREATURE); AssignCommand(oTarget, ClearAllActions(TRUE)); } |
QUOTE (Zirrex @ Jul 12 2005, 12:28) |
Шабашного разбора не будет, потому что этот скрипт срабатывает 1 раз, а если подцепляется второй НПС, эм, забыл указать в скрипте, то ему сразу же очищаю все действия. Совсем иного рода тот же скрипт, но на хартбите. Пока что без правок, как есть: |
Neverwinter Script Source |
//::////////////////////////////////////////////// //:: OnExit am_inc_battle //:: Copyright © 2005 WRG! //::////////////////////////////////////////////// /* БОЕВАЯ БИБЛИОТЕКА */ //::////////////////////////////////////////////// //:: Created By: Aiwan //:: Created On: 27.05.2005 //::///////////////////////////////////////////// // ФУНКЦИЯ ОЧИСТКИ РЕПУТАЦИИ И СМЕНА ВСЕХ НПС НА ЛОКАЦИИ ФРАКЦИИ ВРАГА // НА НЕЙТРАЛЬНУЮ // object oPlayer - Игрок к которому враждебен oEnemy // object oNetral - Объект с новой фракцией // Если не указать кто именно, просто очистит репутацию void ChangeEnemyToNetral(object oPlayer, object oNetral); void ChangeEnemyToNetral(object oPlayer, object oNetral) { object oArea = GetArea(oPlayer); object oEnemy = GetFirstObjectInArea(oArea); object oAnimal = GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION, oPlayer); object oDominated = GetAssociate(ASSOCIATE_TYPE_DOMINATED, oPlayer); object oFamiliar = GetAssociate(ASSOCIATE_TYPE_FAMILIAR, oPlayer); object oSummoned = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPlayer); while (GetIsObjectValid(oEnemy)) { if (GetIsEnemy(oPlayer,oEnemy)) //Если объект зол на игрока { //----------------------- Обработка помощников -------------------------------// if(oAnimal != OBJECT_INVALID) { AssignCommand(oAnimal,ClearAllActions(TRUE)); ClearPersonalReputation(oAnimal,oEnemy);} if(oDominated != OBJECT_INVALID){ AssignCommand(oDominated,ClearAllActions(TRUE)); ClearPersonalReputation(oDominated,oEnemy);} if(oFamiliar != OBJECT_INVALID){ AssignCommand(oFamiliar,ClearAllActions(TRUE)); ClearPersonalReputation(oFamiliar,oEnemy);} if(oSummoned != OBJECT_INVALID){ AssignCommand(oSummoned,ClearAllActions(TRUE)); ClearPersonalReputation(oSummoned,oEnemy);} int i = 1; object oHench = GetHenchman(oPlayer, i); while(oHench != OBJECT_INVALID) { AssignCommand(oHench,ClearAllActions(TRUE)); ClearPersonalReputation(oHench,oEnemy); i++; oHench = GetHenchman(oPlayer, i); } AssignCommand(oEnemy,ClearAllActions(TRUE)); ClearPersonalReputation(oPlayer,oEnemy); AdjustReputation(oPlayer, oEnemy, 50); // Добавил для тебя нейтральные отношения // ChangeFaction(oEnemy,oNetral); // я заккоментировал смену фракции } oEnemy = GetNextObjectInArea(oArea); } } //------------------------------------------------------------------------------ /* void main(){} |
Neverwinter Script Source |
//========================== HEARTBEAT EVENT ================================= if (nEvent == 1001) // Стандартный сигнал { // Если в локации нет игрока, то скрипт блокируется. // if (GetArea(OBJECT_SELF)!=GetArea(GetNearestPC())) {return;} /* Проверка для игры несколькими игроками. Разкомментируйте если вы собираетесь провести здесь партию. */ if (GetArea(OBJECT_SELF)!=GetArea(GetFirstPC())) {return;} /* Работает это для одиночного режима игры. Так проще и быстрее. */ Debug("EVENT_HEARTBEAT"); if (GetLocalInt(OBJECT_SELF, "START_CONVERSATION")==FALSE) { Debug("RETURN"); return; } object oEnemy = OBJECT_SELF; object oPC = GetNearestPC(oEnemy); if (GetIsInCombat(oPC) || GetIsInCombat(oEnemy) || IsInConversation(oPC)) { Debug("РС или НПС занят, что то мешает им поговорить."); return; } if (GetLocalInt(oEnemy, "START_CONVERSATION")==TRUE && GetLocalInt(oEnemy, "REPEAT")==TRUE) { AssignCommand(oEnemy, ClearAllActions()); AssignCommand(oEnemy, ActionForceMoveToObject(oPC,TRUE, 2.0, 15.0)); AssignCommand(oEnemy, ActionStartConversation(oPC)); Debug("Если главарь не смог подойти и поговорить, напомним об этом"); SetLocalInt(oEnemy, "REPEAT", FALSE); DelayCommand(15.0, SetLocalInt(oEnemy, "REPEAT", TRUE)); } } |
QUOTE |
если он почти при смерти врубается скрипт и главарь ждет 10 секунд, что бы закончился раунд. |
QUOTE (Zirrex @ Jul 13 2005, 00:08) |
...но что идеально работает в одиночной игре, то плохо подходит в онлайновой, опробовано уже не раз, и поэтому требует иного решения. |
QUOTE (Zirrex @ Jul 13 2005, 00:08) |
А зачем он это делает, если команда "ClearAllActions(TRUE)", описанная в твоей библиотеке, моментально затирает боевое состояние НПС и персонажа? |
QUOTE (Zirrex @ Jul 13 2005, 00:08) |
Повозившись сегодня со скриптом, удалось добиться, чтобы игрок не мог начинать свой диалог, пока к нему подходит НПС, иначе просто получается, что тот подходит, видит открытый диалог, и не солоно хлебавши уходит. |
QUOTE |
From the 1.66 patch notes: Fixed an issue with the scripting command GetStandardFactionReputation() returning -1 when called on the defender faction with a PC creature object specified |
QUOTE (Zirrex @ Jul 12 2005, 10:28) |
Aiwan, так если его не ставить, охранник начинает движение и тут же говорит фразу |
QUOTE (Zirrex @ Jul 12 2005, 10:28) |
но если цель исчезает, то происходит переполнение стека этими командами, ведь они уже запущены, и в итоге ошибка по стеку |
QUOTE (Zirrex @ Jul 12 2005, 22:08) |
как узнать, кто прав, а кто виноват в произошедшем убийстве? |
Neverwinter Script Source |
if ((GetLocalInt(oSpirit, "Carma_" + sID) < -100) && (GetLocalInt(oPlayer, "PkKiller") != 1) && (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oPlayer) > 10)) { // Поискать в радиусе жертвы живое существо object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 15.0f, GetLocation(oPlayer), TRUE, OBJECT_TYPE_CREATURE); object oNpc; string sTarget = GetTag(oTarget); // Если живое существо есть, то продолжить while (GetIsObjectValid(oTarget) && (GetStringLeft(sTarget, 9) == "npc_guard")) { oNpc = oTarget; if (GetFactionEqual(oTarget, oNpc) && !IsInConversation(oTarget) && !GetIsInCombat(oTarget)) { // Очистить действие игрока и НПС AssignCommand(oTarget, ClearAllActions(TRUE)); AssignCommand(oPlayer, ClearAllActions(TRUE)); // Сбросить открытый диалог у персонажа, если он есть AssignCommand(oPlayer, ActionStartConversation(oTarget)); // Очистить все действия у персонажа DelayCommand(0.3, AssignCommand(oPlayer, ClearAllActions(TRUE))); // Начало сценки для персонажа DelayCommand(0.5, SetCutsceneMode(oPlayer, TRUE)); // Изменение переменной 'PkKiller' на 1. if (GetLocalInt(oPlayer, "PkKiller") != 1) { SetLocalInt(oPlayer, "PkKiller", 1); } // Стражник подбегает к персонажу AssignCommand(oTarget, ActionForceMoveToObject(oPlayer, TRUE, 1.0f, 15.0)); // Стражник говорит фразу персонажу в общий канал AssignCommand(oTarget, ActionSpeakString("Эй, подожди, у меня к тебе неотложный разговор!", TALKVOLUME_TALK)); // Стражник открывает персонажу диалог AssignCommand(oTarget, ActionStartConversation(oPlayer, "am_carma_system", TRUE)); // Окончание сценки DelayCommand(10.0, SetCutsceneMode(oPlayer, FALSE)); break; } // Поискать в радиусе жертвы еще живое существо oTarget = GetNextObjectInShape(SHAPE_SPHERE, 15.0f, GetLocation(oPlayer), TRUE, OBJECT_TYPE_CREATURE); AssignCommand(oTarget, ClearAllActions(TRUE)); } } |
Neverwinter Script Source |
int PWS_PLAYER_STATE_ALIVE = 0; int PWS_PLAYER_STATE_DYING = 1; int PWS_PLAYER_STATE_DEAD = 2; int PWS_PLAYER_STATE_STABLE = 3; int PWS_PLAYER_STATE_STABLEHEAL = 6; int PWS_PLAYER_STATE_RESURRECTED = 7; int PWS_PLAYER_STATE_RESTRUE = 8; int PWS_PLAYER_STATE_RAISEDEAD = 9; int PWS_PLAYER_STATE_FUGUE = 10; object oMod = GetModule(); int GPS(object oPC) { string sID = GetName(oPC) + GetPCPublicCDKey(oPC); return GetLocalInt(oMod, "PlayerState" + sID); } void SPS(object oPC, int nPS) { string sID = GetName(oPC) + GetPCPublicCDKey(oPC); SetLocalInt(oMod, "PlayerState" + sID, nPS); } // Обновление репутации стандартных фракций по отношению к игроку, если он их обидел void ResetReputation(object oPC) { if (GetStandardFactionReputation(STANDARD_FACTION_COMMONER, oPC) <= 10) SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 80, oPC); if (GetStandardFactionReputation(STANDARD_FACTION_MERCHANT, oPC) <= 10) SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 80, oPC); if (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oPC) <= 10) SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 80, oPC); } // Перемещение и восстановление жизни у персонажа void Resurrect(object oPC, object oTransfer) { ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPC); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPC)),oPC); ResetReputation(oPC); AssignCommand(oPC, ActionJumpToObject(oTransfer)); } void NotFugue(object oPC) { string sID = GetName(oPC) + GetPCPublicCDKey(oPC); AssignCommand(GetLocalObject(oMod, "DropBag" + sID), ClearAllActions()); DeleteLocalInt(oPC, "NOTFUGUE"); return; } void MovePlayer(object oPC, object oLimbo) { string sID = GetName(oPC) + GetPCPublicCDKey(oPC); if (GetLocalInt(oMod, "LOOTSYSTEM") && GetLocalInt(oPC, "NOTFUGUE")) { NotFugue(oPC); return; } if (GetLocalInt(oMod,"LOOTSYSTEM") && (GPS(oPC) != PWS_PLAYER_STATE_DEAD)) { AssignCommand(GetLocalObject(oMod, "DropBag" + sID), ClearAllActions()); } Resurrect(oPC, oLimbo); ExecuteScript("ahs_spell_remove", oPC); SetLocalInt(oMod, "LastRest" + sID, 0); DeleteLocalInt(oPC, "LOGINDEATH"); } int RessCheck(object oPC) { if (GetLocalInt(oMod,"GODSYSTEM")) { int nPercent = GetLocalInt(oMod, "GODCHANCE") + (GetHitDice(oPC) / 2); if (GetLocalInt(oPC, "LOGINDEATH")) { return 0; } if (GetDeity(oPC) == "") { SendMessageToPC(oPC, "У вас нет божества, и он не сможет услышать ваших молитв!"); return 0; } else if (d100() > nPercent) { if (GetDeity(oPC) != "") { SendMessageToPC(oPC, "Ваше божество не услышало ваших молитв!"); } return 0; } SendMessageToPC(oPC, "Ваше божество услышало ваши молитвы, и даровало вам жизнь!"); if (GetLocalInt(oMod, "BLEEDSYSTEM")) { SPS(oPC, PWS_PLAYER_STATE_ALIVE); } object oTransfer = GetObjectByTag("wp_hotel_djon_tom"); DelayCommand(12.0, Resurrect(oPC, oTransfer)); return 1; } return 0; } object DropBag(location lDiedHere, object oPC) { object oDropBag; string sID = GetName(oPC) + GetPCPublicCDKey(oPC); location lLoc; if (GetLocalInt(oPC, "LOGINDEATH")) { lLoc = GetLocalLocation(oMod, "DiedHere" + sID); } else { lLoc = GetLocation(oPC); } vector vLootBag = GetPositionFromLocation(lLoc); float fFacing = GetFacing(oPC) + (Random(2)?90.0:-90.0); vLootBag.x += cos(fFacing) * 1.0f; vLootBag.y += sin(fFacing) * 1.0f; location lDropBag = Location(GetArea(oPC), vLootBag, fFacing + 180.0); oDropBag = CreateObject(OBJECT_TYPE_PLACEABLE, "DyingCorpse", lDropBag, FALSE, "DropBag" + sID); SetLocalObject(oPC, "DROPBAG", oDropBag); SetLocalString(oDropBag, "Pkey", sID); return oDropBag; } void CheckDropBag(object oDropBag) { object oItem = GetFirstItemInInventory(oDropBag); if (!GetIsObjectValid(oItem)) { DelayCommand(4.0, DestroyObject(oDropBag)); } } void CreateCorpse(object oPC) { string sID = GetName(oPC) + GetPCPublicCDKey(oPC); object oDC; location lLoc; if (GetLocalInt(oPC, "LOGINDEATH")) { lLoc = GetLocalLocation(oMod, "DiedHere" + sID); oDC = CopyObject(oPC, lLoc); } else { oDC = CopyObject(oPC, GetLocation(oPC)); } DeleteLocalInt(oPC, "LOGINDEATH"); ChangeToStandardFaction(oDC, STANDARD_FACTION_COMMONER); AssignCommand(oDC, SetIsDestroyable(FALSE, FALSE, FALSE)); SetLocalObject(oMod, "Corpse" + sID, oDC); object oDeathCorpse = GetLocalObject(oMod, "DeathCorpse" + sID); SetLocalString(oDeathCorpse, "CorpseKey", sID); AssignCommand(oDC, TakeGoldFromCreature(GetGold(oDC), oDC, TRUE)); object oItem = GetFirstItemInInventory(oDC); while (GetIsObjectValid(oItem)) { DestroyObject(oItem); oItem = GetNextItemInInventory(oDC); } } void main() { object oPC = GetLastPlayerDied(); string sName = GetName(oPC); string sCDK = GetPCPublicCDKey(oPC); string sID = sName + sCDK; // переключение переменной, нужна, чтобы не могли воскресить персонажа, // пока тот переносится в фугу SetLocalInt(oPC, "MOVING", TRUE); object oHenchman = GetHenchman(oPC); // если есть помощник, отпустить if (GetIsObjectValid(oHenchman)) { RemoveHenchman(oPC, oHenchman); } object oDeathCorpse, oPCCorpse, oDeadMan, oDropBag; location lDiedHere; // проверка божества, если боги смилуются, то выполнение дальнейшего скрипта запретить if (GetLocalInt(oMod, "GODSYSTEM")) { if (RessCheck(oPC)) { return; } } // Это условие запускается только при входе персонажа на шард if (GetLocalInt(oPC, "LOGINDEATH") && GetIsObjectValid(oPC)) { // на момент смерти эта переменная равна 1, поэтому условие не выполняется if (!GetLocalInt(oPC, "GRAVEYARD")) { lDiedHere = GetLocalLocation(oMod, "DiedHere" + sID); } // выполняется это, когда персонаж входит с Камнем души на шард else { DeleteLocalInt(oPC, "GRAVEYARD"); // Случайный выбор могилы int iRnum = Random(72) + 1; // Тэг точки перехода string sBase = "wp_corpse_drop_"; // Присоединение к тэгу точки перехода случайной цифры string sGoto = sBase + IntToString(iRnum); // Создание окончательной точки перехода lDiedHere = GetLocation(GetObjectByTag(sGoto)); // Установка локации, где покоится тело персонажа SetLocalLocation(oMod, "DiedHere" + sID, lDiedHere); } } // Обычное выполнение условия, если персонаж умирает на шарде else if (GetIsObjectValid(oPC)) { // Берется место смерти персонажи lDiedHere = GetLocation(oPC); // Сохраняется место смерти на переменную SetLocalLocation(oMod, "DiedHere" + sID, lDiedHere); } // Если включена система смерти с трупом, и есть персонаж, то выполнить if (GetLocalInt(oMod, "DEATHSYSTEM") && GetIsObjectValid(oPC)) { // Переключение состояния персонажа SPS(oPC, PWS_PLAYER_STATE_DEAD); if (GetLocalInt(oPC, "LOGINDEATH")) { location lLoc = lDiedHere; object oObject = GetNearestObjectToLocation(OBJECT_TYPE_PLACEABLE, lLoc); if (GetTag(oObject) == "DeathCorpse") { // Окончательно определение места смерти с некоторыми подробностями lDiedHere = Location(GetArea(oObject), GetPositionFromLocation(lLoc), GetFacing(oPC)); } } // Если включена Лут система, то продолжить и создать сумку, куда // сложить деньги. Не обрабатывать на нижеописанных локациях. if (GetLocalInt(oMod, "LOOTSYSTEM") && (GetHitDice(oPC) >= 8) && (GetTag(GetArea(oPC)) != "amen_start_sm") && (GetTag(GetArea(oPC)) != "amen_ht_arena") && (GetTag(GetArea(oPC)) != "amen_dt_magepl") && (GetTag(GetArea(oPC)) != "amen_fortress")) { oDropBag = GetLocalObject(oMod,"DropBag" + sID); // Если нет, сумки, создать новую if (!GetIsObjectValid(oDropBag)) { oDropBag = DropBag(lDiedHere, oPC); SetLocalObject(oDropBag, "Owner", oPC); SetLocalString(oDropBag, "Name", sName); SetLocalString(oDropBag, "Key", sCDK); SetLocalString(oDropBag, "Pkey", sID); SetLocalObject(oMod, "DropBag" + sID, oDropBag); } // Если состояние персонажа "Мертв", создать деньги в сумке. if (GPS(oPC) != PWS_PLAYER_STATE_DYING) { int nAmtGold = GetGold(oPC); if (nAmtGold > 0 && GetIsObjectValid(oDropBag)) { object oBag = CreateItemOnObject("bagofgold", oDropBag); SetLocalInt(oBag, "AmtGold", nAmtGold); SetLocalInt(oDropBag, "AmtGold", nAmtGold); AssignCommand(oDropBag, TakeGoldFromCreature(nAmtGold, oPC, TRUE)); } } } // Проверить сумку, если она пуста, удалить CheckDropBag(oDropBag); // Создание тела персонажа, который уже умер, если умирает тот, кто несет это тело ExecuteScript("ahs_dc_corpse", oPC); // Создание контейнера телу персонажа if (!GetIsObjectValid(oDeathCorpse)) { oDeathCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "DC", lDiedHere); // Присвоение данной переменной только на локации "Арена" if (GetTag(GetArea(oPC)) == "amen_ht_arena") { SetLocalObject(oDeathCorpse, "Arena", GetArea(oPC)); } SetLocalObject(oDeathCorpse, "Owner", oPC); SetLocalString(oDeathCorpse, "Name", sName); SetLocalString(oDeathCorpse, "Key", sCDK); SetLocalString(oDeathCorpse, "Pkey", sID); SetLocalInt(oDeathCorpse, "Level", GetHitDice(oPC)); SetLocalObject(oMod, "DeathCorpse" + sID, oDeathCorpse); } // В созданный контейнер вложить тело игрока. Облик зависит от пола персонажа oDeadMan = GetLocalObject(oMod, "PlayerCorpse" + sID); if (!GetIsObjectValid(oDeadMan)) { oDeadMan = CreateItemOnObject(GetGender(oPC)?"femalecorpse":"malecorpse", oDeathCorpse); // Присвоение данной переменной только на локации "Арена" if (GetTag(GetArea(oPC)) == "amen_ht_arena") { SetLocalObject(oDeadMan, "Arena", GetArea(oPC)); } SetLocalObject(oPC, "PlayerToken", oDeadMan); SetLocalObject(oDeadMan, "Owner", oPC); SetLocalString(oDeadMan, "Name", sName); SetLocalString(oDeadMan, "Key", sCDK); SetLocalString(oDeadMan, "PKey", sID); SetLocalInt(oDeadMan, "Level", GetHitDice(oPC)); SetLocalInt(oDeadMan, "Alignment", GetAlignmentGoodEvil(oPC)); SetLocalInt(oDeadMan, "Gender", GetGender(oPC)); SetLocalString(oDeadMan, "Deity", GetDeity(oPC)); SetLocalObject(oDeathCorpse, "PlayerCorpse", oDeadMan); SetLocalObject(oDeadMan, "DeathCorpse", oDeathCorpse); SetLocalObject(oMod, "PlayerCorpse" + sID, oDeadMan); } // Создание копии тела через 7.0 секунд на месте смерти персонажа DelayCommand(7.0, CreateCorpse(oPC)); } // Затирание времени до следующего сна SetLocalInt(oMod, "LastRecCheck" + sID, 0); // Если включена система Лимбо и Смерти, продолжить if (GetLocalInt(oMod, "LIMBO") && GetLocalInt(oMod, "DEATHSYSTEM")) { // Последнее утверждение места смерти персонажа SetLocalLocation(oMod, "DiedHere" + sID, lDiedHere); // При смерти перемещают в фугу, а если есть камень Абисса, то в Абисс if (GetLocalInt(oMod, "CARMASYSTEM") && (GetItemPossessedBy(oPC, "am_stn_abyss_2") != OBJECT_INVALID)) { DelayCommand(7.2, MovePlayer(oPC, GetObjectByTag("wp_abyss"))); } else { DelayCommand(7.2, MovePlayer(oPC, GetObjectByTag("wp_enter_fugue"))); } } } |
Neverwinter Script Source |
location StringToLocation(string sLocation) { location lReturnValue; object oArea; vector vPosition; float fOrientation, fX, fY, fZ; int iPos, iCount; int iLen = GetStringLength(sLocation); if (iLen > 0) { iPos = FindSubString(sLocation, "#AREA#") + 6; iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#"); oArea = GetObjectByTag(GetSubString(sLocation, iPos, iCount)); iPos = FindSubString(sLocation, "#POSITION_X#") + 12; iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#"); fX = StringToFloat(GetSubString(sLocation, iPos, iCount)); iPos = FindSubString(sLocation, "#POSITION_Y#") + 12; iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#"); fY = StringToFloat(GetSubString(sLocation, iPos, iCount)); iPos = FindSubString(sLocation, "#POSITION_Z#") + 12; iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#"); fZ = StringToFloat(GetSubString(sLocation, iPos, iCount)); vPosition = Vector(fX, fY, fZ); iPos = FindSubString(sLocation, "#ORIENTATION#") + 13; iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#"); fOrientation = StringToFloat(GetSubString(sLocation, iPos, iCount)); lReturnValue = Location(oArea, vPosition, fOrientation); } return lReturnValue; } |
Neverwinter Script Source |
string LocationToString(location lLocation) { object oArea = GetAreaFromLocation(lLocation); vector vPosition = GetPositionFromLocation(lLocation); float fOrientation = GetFacingFromLocation(lLocation); string sReturnValue; if (GetIsObjectValid(oArea)) sReturnValue = "#AREA#" + GetTag(oArea) + "#POSITION_X#" + FloatToString(vPosition.x) + "#POSITION_Y#" + FloatToString(vPosition.y) + "#POSITION_Z#" + FloatToString(vPosition.z) + "#ORIENTATION#" + FloatToString(fOrientation) + "#END#"; return sReturnValue; } |
Neverwinter Script Source |
iPos = FindSubString(sLocation, "#AREA#") + 6; |
CODE |
[nss]скрипт[/nss] |
QUOTE (GoingPro) @ Jul 14 2005, 17:05) |
Хочу зделать так что бы игроку при заходе в модуль открывалось диологовое окно (ну это я знаю как)... Что бы его нельзя было закрыть до завершения |
QUOTE (GoingPro) @ Jul 14 2005, 17:05) |
А bootPC(oPC) это на всегда? ну тоесть это бан игрока? |
QUOTE (GoingPro) @ Jul 14 2005, 17:05) |
Объясните мне пожалуйсто безтолковому как это работает? |
Neverwinter Script Source |
object oDefender = GetObjectByTag("самый главный дефендер"); // сидящий где-нибудь в темном углу и трясущийся от страха =] if ((GetLocalInt(oSpirit, "Carma_" + sID) < -100) && (GetLocalInt(oPlayer, "PkKiller") != 1) && //(GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oPlayer) // ^^^ это всегда возвращает -1 В ВЕРСИЯХ ДО 1.66! - читай внимательней. (GetReputation(oPlayer, oDefender) > 10)) { // Поискать в радиусе жертвы живое существо object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 15.0f, GetLocation(oPlayer), TRUE, OBJECT_TYPE_CREATURE); // Если живое существо есть, то продолжить // while (GetIsObjectValid(oTarget) && (GetStringLeft(sTarget, 9) == "npc_guard")) // ^^^ такая проверка приводит к тому, что если первый попавшийся // непись не будет дефендером, цикл прекращается. таким образом // ты будешь курить бамбук, пока первым объектом не попадется дефендер while (GetIsObjectValid(oTarget)) { //oNpc = oTarget; //if (GetFactionEqual(oTarget, oNpc) &&... // ^^^ вот этот кусок - это... это... if (GetFactionEqual(oTarget, oDefender) && !IsInConversation(oTarget) && !GetIsInCombat(oTarget)) { // Очистить действие игрока и НПС AssignCommand(oTarget, ClearAllActions(TRUE)); AssignCommand(oPlayer, ClearAllActions(TRUE)); // Сбросить открытый диалог у персонажа, если он есть AssignCommand(oPlayer, ActionStartConversation(oTarget)); // Очистить все действия у персонажа DelayCommand(0.3, AssignCommand(oPlayer, ClearAllActions(TRUE))); // Начало сценки для персонажа DelayCommand(0.5, SetCutsceneMode(oPlayer, TRUE)); // Изменение переменной 'PkKiller' на 1. if (GetLocalInt(oPlayer, "PkKiller") != 1) { SetLocalInt(oPlayer, "PkKiller", 1); } // Стражник подбегает к персонажу AssignCommand(oTarget, ActionForceMoveToObject(oPlayer, TRUE, 1.0f, 15.0)); // Стражник говорит фразу персонажу в общий канал AssignCommand(oTarget, ActionSpeakString("Эй, подожди, у меня к тебе неотложный разговор!", TALKVOLUME_TALK)); // Стражник открывает персонажу диалог AssignCommand(oTarget, ActionStartConversation(oPlayer, "am_carma_system", TRUE)); // Окончание сценки DelayCommand(10.0, SetCutsceneMode(oPlayer, FALSE)); break; } // Поискать в радиусе жертвы еще живое существо oTarget = GetNextObjectInShape(SHAPE_SPHERE, 15.0f, GetLocation(oPlayer), TRUE, OBJECT_TYPE_CREATURE); //AssignCommand(oTarget, ClearAllActions(TRUE)); // ^^^ зачем всех чистить?! - тем более, что чистятся только те, кто попался раньше дефендера... } } |
QUOTE (Zirrex @ Jul 14 2005, 10:18) |
Теперь персонажу не удастся сбежать, как это было раньше. |
Neverwinter Script Source |
object oDefender = GetObjectByTag(GetStringLeft("npc_guard", 9)); |
Neverwinter Script Source |
#include "ahs_sp_spirit" void main() { object oPercep = GetLastPerceived(); object oGuard = OBJECT_SELF; object oSpirit = GetPlayerSpirit(oPercep); string sID = GetName(oPercep) + GetPCPublicCDKey(oPercep); // проверка репутации между персонажем и стражником if (GetReputation(oPercep, oGuard) > 10) { // проверка репутации персонажа, если выше -100, остановить if (GetLocalInt(oSpirit, "Carma_" + sID) > -100) return; // если в имени тэга нет этих слова, остановить if (GetStringLeft(GetTag(oGuard), 9) != "npc_guard") return; // если персонаж в этих локациях, остановить // думаю, лишнее, ибо в этих локациях нет стражников. if ((GetTag(GetArea(oPercep)) == "amen_start_sm") || (GetTag(GetArea(oPercep)) == "am_lost_souls_w_sm") || (GetTag(GetArea(oPercep)) == "amen_ht_arena") || (GetTag(GetArea(oPercep)) == "amen_dt_magepl") || (GetTag(GetArea(oPercep)) == "amen_fortress") || (GetTag(GetArea(oPercep)) == "amen_ht_prison")) { return; } // проверка дистанции стражника до цели, если больше 10, остановить if (GetDistanceToObject(oPercep) > 10.0) return; // если переменная существует, остановить if (GetLocalInt(oPercep, "PkKiller") == TRUE) return; // если стражник не сражается и не говорит, продолжить if (!IsInConversation(oGuard) && !GetIsInCombat(oGuard)) { string sMessage; int iRandom = d12(); switch (iRandom) { case 1: sMessage = "Эй, подождите, у меня к вам неотложный разговор!"; break; case 2: sMessage = "Эй, что-то мне лицо ваше не нравится?!"; break; case 3: sMessage = "Охрана не дремлет! Оставаться на месте, и не двигаться!"; break; case 4: sMessage = "Стоять! Вы арестованы!"; break; case 5: sMessage = "Стоять! Малейшее движение, и вы пожалеете, что я вообще вас заметил!"; break; case 6: sMessage = "Оставайтесь на месте! Вот так. А теперь поговорим."; break; case 7: sMessage = "Погодите, не спешите, надо поговорить."; break; case 8: sMessage = "Вот ведь мне как везет сегодня, вы то мне и нужны."; break; case 9: sMessage = "Что-то ходят слухи, что вы нарушаете закон!"; break; case 10: sMessage = "По-моему я вас где-то видел? Ах да, вы то мне и нужны..."; break; case 11: sMessage = "Сегодня у меня удачный день, а у вас видимо, нет..."; break; case 12: sMessage = "Кто это тут у нас? Хе-хе, как я погляжу, у вас руки уже дрожат!"; break; } // Очистить действие игрока и НПС AssignCommand(oGuard, ClearAllActions(TRUE)); AssignCommand(oPercep, ClearAllActions(TRUE)); // Сбросить открытый диалог у персонажа, если он есть AssignCommand(oPercep, ActionStartConversation(oGuard)); // Очистить все действия у персонажа DelayCommand(0.1, AssignCommand(oPercep, ClearAllActions(TRUE))); // Начало сценки для персонажа DelayCommand(0.2, SetCutsceneMode(oPercep, TRUE)); // Изменение переменной 'PkKiller' на 1. if (GetLocalInt(oPercep, "PkKiller") != TRUE) { SetLocalInt(oPercep, "PkKiller", TRUE); } // Стражник подбегает к персонажу AssignCommand(oGuard, ActionForceMoveToObject(oPercep, TRUE, 1.0f, 5.0)); // Стражник говорит фразу персонажу в общий канал AssignCommand(oGuard, ActionSpeakString(sMessage, TALKVOLUME_TALK)); // Стражник открывает персонажу диалог AssignCommand(oGuard, ActionStartConversation(oPercep, "am_carma_system", TRUE)); } } } |
Neverwinter Script Source |
/* Function return the new property of item */ itemproperty ReturnNewProperty (object oItem, int nProperty) { object oPlayer = GetFirstPC (); itemproperty itemprop; switch (nProperty) { case IP_CONST_DAMAGETYPE_ACID: case IP_CONST_DAMAGETYPE_FIRE: case IP_CONST_DAMAGETYPE_COLD: case IP_CONST_DAMAGETYPE_ELECTRICAL: case IP_CONST_DAMAGETYPE_MAGICAL: case IP_CONST_DAMAGETYPE_NEGATIVE: case IP_CONST_DAMAGETYPE_POSITIVE: { int nDamBonus = GetLocalInt (oPlayer, "DAMAGE_BONUS"); itemprop = ItemPropertyDamageBonus (nType, nDamBonus); break; } case CONST_ATTACK_BONUS: { int nCount = GetLocalInt (oPlayer, "COUNT"); itemprop = ItemPropertyAttackBonus (nCount); break; } case CONST_KEEN: { itemprop = ItemPropertyKeen (); break; } case CONST_SPELL_RESISTANCE: { int nResist = GetLocalInt (oPlayer, "SPELL_RESIST"); itemprop = ItemPropertyBonusSpellResistance (nResist); break; } case CONST_TRUE_SEEING: { itemprop = ItemPropertyTrueSeeing (); break; } case CONST_REGENERATION: { int nReg = GetLocalInt (oPlayer, "COUNT"); itemprop = ItemPropertyRegeneration (nReg); break; } case IP_CONST_ABILITY_CHA: //***** case IP_CONST_ABILITY_CON: case IP_CONST_ABILITY_DEX: case IP_CONST_ABILITY_INT: case IP_CONST_ABILITY_STR: case IP_CONST_ABILITY_WIS: { int nCount = GetLocalInt (oPlayer, "COUNT"); itemprop = ItemPropertyAbilityBonus (nProperty, nCount); break; } case CONST_HASTE: { itemprop = ItemPropertyHaste (); break; } /* case CONST_SPELL_IMMUNE_LEVEL: { int nCount = GetLocalInt (oPlayer, "COUNT"); itemprop = ItemPropertyImmuneToSpellLevel (nCount); break; } */ case CONST_ONHIT_PROPS: { int nSaveDC = GetLocalInt (oPlayer, "SAVE_DC"); int nSpecial = GetLocalInt (oPlayer, "SPECIAL"); itemprop = ItemPropertyOnHitProps (nProperty, nSaveDC, nSpecial); break; } case CONST_VAMPIRIC_REGENERATION: { int nVampReg = GetLocalInt (oPlayer, "COUNT"); itemprop = ItemPropertyVampiricRegeneration (nVampReg); break; } case ITEM_VISUAL_ACID: case ITEM_VISUAL_COLD: case ITEM_VISUAL_ELECTRICAL: case ITEM_VISUAL_EVIL: case ITEM_VISUAL_FIRE: case ITEM_VISUAL_HOLY: case ITEM_VISUAL_SONIC: { itemprop = ItemPropertyVisualEffect (nProperty); break; } case CONST_DARKVISION: { itemprop = ItemPropertyDarkvision (); break; } } } |
Neverwinter Script Source |
int GetAbilityBonus (object oItem, int nAbility) { itemproperty ip = GetFirstItemProperty (oItem); while (GetIsItemPropertyValid (ip)) { if (GetItemPropertyType (ip) == nAbility) { return GetItemPropertySubType (ip); } ip = GetNextItemProperty (oItem); } } |
Neverwinter Script Source |
void main() { object oPC = GetPCItemLastEquippedBy(); object oItem = GetPCItemLastEquipped(); string sTag = GetTag(oItem); if (sTag == "am_it_sword") { effect eStrength = SupernaturalEffect(EffectAbilityIncrease(ABILITY_STRENGTH, 12)); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eStrength, oPC); } } |
Neverwinter Script Source |
void main() { object oPC = GetPCItemLastUnequippedBy(); object oItem = GetPCItemLastUnequipped(); string sTag = GetTag(oItem); if (sTag == "am_it_sword") { effect eEff = GetFirstEffect(oPC); while (GetIsEffectValid(eEff)) { if (GetEffectType(eEff) == EFFECT_TYPE_ABILITY_INCREASE && GetEffectSubType(eEff) == SUBTYPE_SUPERNATURAL) { RemoveEffect(oPC, eEff); } eEff = GetNextEffect(oPC); } } |
Neverwinter Script Source |
//:://///////////////////////////////////////////// //:: Name UpdateWeapon.nss //:: Copyright DSS //::////////////////////////////////////////////// /* БИБЛИОТЕКА ДЛЯ УЛУЧШЕНИЯ ОРУЖИЯ */ //::////////////////////////////////////////////// //:: Created By: minion //:: Created On: july 2005 //::////////////////////////////////////////////// ////////////////////////////////////////////////// // CONSTANTS ////////////////////////////////////////////////// const int CONST_ATTACK_BONUS = 19000; const int CONST_KEEN = 19003; const int CONST_TRUE_SEEING = 19005; const int CONST_SPELL_RESISTANCE = 19006; const int CONST_REGENERATION = 19007; const int CONST_HASTE = 19002; const int CONST_SPELL_IMMUNE_LEVEL = 18100; const int CONST_ONHIT_PROPS = 18101; const int CONST_VAMPIRIC_REGENERATION = 18102; const int CONST_DARKVISION = 18103; ////////////////////////////////////////////////// // FUNCTIONS ////////////////////////////////////////////////// /* Вывод отладочного сообщения */ void debug (string sMes) { object oPlayer = GetFirstPC (); SendMessageToPC (oPlayer, sMes); } /* Function delete all temporary properties from item */ void RemoveTemporaryProperties (object oItem, int nDurType = DURATION_TYPE_TEMPORARY) { itemproperty itemprop = GetFirstItemProperty (oItem); int nPropDurType; while (GetIsItemPropertyValid (itemprop)) { nPropDurType = GetItemPropertyDurationType (itemprop); if (nPropDurType == nDurType) RemoveItemProperty (oItem, itemprop); itemprop = GetNextItemProperty (oItem); } } /* Function return the new property of item */ itemproperty ReturnNewProperty (object oItem, int nProperty) { object oPlayer = GetFirstPC (); itemproperty itemprop; int nCount, nSaveDC, nSpecial; if ((nProperty == IP_CONST_DAMAGETYPE_ACID) || (nProperty == IP_CONST_DAMAGETYPE_FIRE) || (nProperty == IP_CONST_DAMAGETYPE_COLD) || (nProperty == IP_CONST_DAMAGETYPE_ELECTRICAL)) { nCount = GetLocalInt (oPlayer, "DAMAGE_BONUS"); itemprop = ItemPropertyDamageBonus (nProperty, nCount); } else if ((nProperty == IP_CONST_DAMAGETYPE_MAGICAL) || (nProperty == IP_CONST_DAMAGETYPE_NEGATIVE) || (nProperty == IP_CONST_DAMAGETYPE_POSITIVE)) { nCount = GetLocalInt (oPlayer, "DAMAGE_BONUS"); itemprop = ItemPropertyDamageBonus (nProperty, nCount); } else if (nProperty == CONST_ATTACK_BONUS) { nCount = GetLocalInt (oPlayer, "COUNT"); itemprop = ItemPropertyAttackBonus (nCount); } else if (nProperty == CONST_KEEN) { itemprop = ItemPropertyKeen (); } else if (nProperty == CONST_SPELL_RESISTANCE) { nCount = GetLocalInt (oPlayer, "SPELL_RESIST"); itemprop = ItemPropertyBonusSpellResistance (nCount); } else if (nProperty == CONST_TRUE_SEEING) { itemprop = ItemPropertyTrueSeeing (); } else if (nProperty == CONST_REGENERATION) { nCount = GetLocalInt (oPlayer, "COUNT"); itemprop = ItemPropertyRegeneration (nCount); } else if ((nProperty == IP_CONST_ABILITY_CHA) || (nProperty == IP_CONST_ABILITY_CON) || (nProperty == IP_CONST_ABILITY_DEX) || (nProperty == IP_CONST_ABILITY_INT) || (nProperty == IP_CONST_ABILITY_STR) || (nProperty == IP_CONST_ABILITY_WIS)) { nCount = GetLocalInt (oPlayer, "COUNT"); itemprop = ItemPropertyAbilityBonus (nProperty, nCount); } else if (nProperty == CONST_HASTE) { itemprop = ItemPropertyHaste (); } /* else if (nProperty == CONST_SPELL_IMMUNE_LEVEL) { nCount = GetLocalInt (oPlayer, "COUNT"); itemprop = ItemPropertyImmuneToSpellLevel (nCount); } */ else if (nProperty == CONST_ONHIT_PROPS) { nSaveDC = GetLocalInt (oPlayer, "SAVE_DC"); nSpecial = GetLocalInt (oPlayer, "SPECIAL"); itemprop = ItemPropertyOnHitProps (nProperty, nSaveDC, nSpecial); } else if (nProperty == CONST_VAMPIRIC_REGENERATION) { nCount = GetLocalInt (oPlayer, "COUNT"); itemprop = ItemPropertyVampiricRegeneration (nCount); } else // По умолчанию будет CONST_DARKVISION { itemprop = ItemPropertyDarkvision (); } return itemprop; } /* Function removing matching properties from item */ void RemoveMatchingProperties (object oItem, int nType, int nSubType) { itemproperty itemp = GetFirstItemProperty (oItem); while (GetIsItemPropertyValid (itemp)) { if (GetItemPropertyType (itemp) == nType) { if (GetItemPropertySubType (itemp) == nSubType) { RemoveItemProperty (oItem, itemp); } } itemp = GetNextItemProperty (oItem); } } /* Function check PC gold needed for service */ int GetGoldForService (int nServ) { int nGoldNeed, nCount, nSaveDC, nSpecial; object oPlayer = GetFirstPC (); int nMN = GetLocalInt (oPlayer, "MN"); if ((nServ == IP_CONST_DAMAGETYPE_ACID) || (nServ == IP_CONST_DAMAGETYPE_FIRE) || (nServ == IP_CONST_DAMAGETYPE_COLD) || (nServ == IP_CONST_DAMAGETYPE_ELECTRICAL)) { nCount = GetLocalInt (oPlayer, "COUNT"); nGoldNeed = nCount*nMN; } else if ((nServ == IP_CONST_DAMAGETYPE_MAGICAL) || (nServ == IP_CONST_DAMAGETYPE_NEGATIVE) || (nServ == IP_CONST_DAMAGETYPE_POSITIVE)) { nCount = GetLocalInt (oPlayer, "COUNT"); nGoldNeed = nCount*nMN; } else if (nServ == CONST_ATTACK_BONUS) { nCount = GetLocalInt (oPlayer, "COUNT"); nGoldNeed = nCount*nMN; } else if (nServ == CONST_KEEN) { nGoldNeed = 70000; } else if (nServ == CONST_SPELL_RESISTANCE) { nCount = GetLocalInt (oPlayer, "SPELL_RESIST"); nGoldNeed = nCount*nMN; } else if (nServ == CONST_TRUE_SEEING) { nGoldNeed = 70000; } else if (nServ == CONST_REGENERATION) { nCount = GetLocalInt (oPlayer, "COUNT"); nGoldNeed = nCount*nMN; } else if ((nServ == IP_CONST_ABILITY_CHA) || (nServ == IP_CONST_ABILITY_CON) || (nServ == IP_CONST_ABILITY_DEX) || (nServ == IP_CONST_ABILITY_INT) || (nServ == IP_CONST_ABILITY_STR) || (nServ == IP_CONST_ABILITY_WIS)) { nCount = GetLocalInt (oPlayer, "COUNT"); nGoldNeed = nCount*nMN; } else if (nServ == CONST_HASTE) { nGoldNeed = 150000; } /* else if (nServ == CONST_SPELL_IMMUNE_LEVEL) { nCount = GetLocalInt (oPlayer, "COUNT"); nGoldNeed = nCount*nMN; } */ else if (nServ == CONST_ONHIT_PROPS) { nSaveDC = GetLocalInt (oPlayer, "SAVE_DC"); nSpecial = GetLocalInt (oPlayer, "SPECIAL"); nGoldNeed = (nSaveDC + nSpecial) * nMN / 50; } else if (nServ == CONST_VAMPIRIC_REGENERATION) { nCount = GetLocalInt (oPlayer, "COUNT"); nGoldNeed = nCount*nMN; } else // По умолчанию будет CONST_DARKVISION { nGoldNeed = 50000; } return nGoldNeed; } /* Function add the new property to the item */ void AddNewProperty (object oItem, itemproperty itemp) { int nType = GetItemPropertyType (itemp); int nSubType = GetItemPropertySubType (itemp); RemoveMatchingProperties (oItem, nType, nSubType); AddItemProperty (DURATION_TYPE_PERMANENT, itemp, oItem); debug ("costtable : " + IntToString (GetItemPropertyCostTable(itemp))); debug ("value : " + IntToString (GetItemPropertyCostTableValue (itemp))); } /* Функция проверяет наличие свойства. Если такового нет возвращает FALSE. */ int GetItemHasProperty (object oItem, itemproperty ip) { itemproperty itemp = GetFirstItemProperty (oItem); while (GetIsItemPropertyValid (itemp)) { if (GetItemPropertyType (itemp) == GetItemPropertyType (ip)) { if (GetItemPropertySubType (itemp) == GetItemPropertySubType (ip)) { return TRUE; } } itemp = GetNextItemProperty (oItem); } return FALSE; } /* Функция возвращает бонус характеристики. Если такового нет, то возвращает -1. */ int GetAbilityBonus (object oItem, int nAbility) { int n; itemproperty itemp; for (n == 1; n < 13; n++) { itemp = ItemPropertyAbilityBonus (nAbility, n); if (GetItemHasProperty (oItem, itemp)) return TRUE; } return -1; } |
Neverwinter Script Source |
void main() { SetLocked(OBJECT_SELF, TRUE); object oPC = GetLastUsedBy(); int kItems = GetCampaignInt(GetModuleName(), "kwares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC)); while (kItems > 0) { string sItem = GetCampaignString(GetModuleName(), "wares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC) + IntToString(kItems)); CreateItemOnObject(sItem, OBJECT_SELF, 1); kItems = kItems -1; } } |
Neverwinter Script Source |
void main() { object oPC = GetLastUsedBy(); int kItems = 0; object oItem = GetFirstItemInInventory(OBJECT_SELF); SetLocked(OBJECT_SELF, TRUE); while(GetIsObjectValid(oItem) == TRUE) { kItems = kItems + 1; string sRes = GetResRef(oItem); SetCampaignString(GetModuleName(), "wares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC) + IntToString(kItems), sRes); DestroyObject(oItem); oItem = GetNextItemInInventory(OBJECT_SELF); } SetCampaignInt(GetModuleName(), "kwares" + GetPCPlayerName(oPC) + GetPCPublicCDKey(oPC), kItems); } ве вроди бы работает, только есть две проблемы, во первых траблы со стак предметами, во вторых иногда исчезает какая нибудь одна вещь |
Neverwinter Script Source |
string LocationToString(location lLocation) { object oArea = GetAreaFromLocation(lLocation); vector vPosition = GetPositionFromLocation(lLocation); float fOrientation = GetFacingFromLocation(lLocation); string sReturnValue; if (GetIsObjectValid(oArea)) sReturnValue = "#AREA#" + GetTag(oArea) + "#POSITION_X#" + FloatToString(vPosition.x) + "#POSITION_Y#" + FloatToString(vPosition.y) + "#POSITION_Z#" + FloatToString(vPosition.z) + "#ORIENTATION#" + FloatToString(fOrientation) + "#END#"; return sReturnValue; } void main() { object oPC = GetExitingObject(); object oItem = GetItemPossessedBy(oPC, "tag_of_item"); string sReturnValue; location lLocation = GetLocation(oPC); if (GetIsPC(oPC)) { LocationToString(lLocation); SetLocalString(oItem, "Location" + GetPCPlayerName(oPC), sReturnValue); } } |
Neverwinter Script Source |
location StringToLocation(string sLocation) { location lReturnValue; object oArea; vector vPosition; float fOrientation, fX, fY, fZ; int iPos, iCount; int iLen = GetStringLength(sLocation); if (iLen > 0) { iPos = FindSubString(sLocation, "#AREA#") + 6; iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#"); oArea = GetObjectByTag(GetSubString(sLocation, iPos, iCount)); iPos = FindSubString(sLocation, "#POSITION_X#") + 12; iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#"); fX = StringToFloat(GetSubString(sLocation, iPos, iCount)); iPos = FindSubString(sLocation, "#POSITION_Y#") + 12; iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#"); fY = StringToFloat(GetSubString(sLocation, iPos, iCount)); iPos = FindSubString(sLocation, "#POSITION_Z#") + 12; iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#"); fZ = StringToFloat(GetSubString(sLocation, iPos, iCount)); vPosition = Vector(fX, fY, fZ); iPos = FindSubString(sLocation, "#ORIENTATION#") + 13; iCount = FindSubString(GetSubString(sLocation, iPos, iLen - iPos), "#"); fOrientation = StringToFloat(GetSubString(sLocation, iPos, iCount)); lReturnValue = Location(oArea, vPosition, fOrientation); } return lReturnValue; } void main() { object oPC = GetEnteringObject(); object oItem = GetItemPossessedBy(oPC, "tag_of_item"); location lReturnValue; string sLocation = GetLocalString(oItem, "Location" + GetPCPlayerName(oPC)); if (GetIsPC(oPC)) { StringToLocation(sLocation); AssignCommand(oPC, ActionJumpToLocation(lReturnValue)); } } |
QUOTE (GoingPro) @ Jul 18 2005, 11:30) |
На ОнЕкзит |
QUOTE |
All data that pertains to the player is unavailable (GetPCPlayerName, GetPCPublicCDKey, GetPCIPAddress) and the player has become detatched from the character object, hence GetIsPC returns false. If you want any of this information at time of client leave, you must have already stored this information (on client enter is a good time to do this). Also, due to this, no locals can be stored on the PC at this time. |
Neverwinter Script Source |
object oPC = GetExitingObject(); object oItem = GetItemPossessedBy(oPC, "tag_of_item"); SetLocalString(oItem, "Location",LocationToString(GetLocation(oPC))); |
Neverwinter Script Source |
object oPC = GetEnteringObject(); object oItem = GetItemPossessedBy(oPC, "tag_of_item"); if (oItem == OBJECT_INVALID) // если еще нету, создаем. CreateItemOnObject("tag_of_item", oPC); else ActionJumpToLocation(StringToLocation(GetLocalString(oItem, "Location"))); |
Neverwinter Script Source |
//ôëàã SetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPlayer),"yes"); //ëîêàöèÿ location lDeath = GetLocation(oPlayer); SetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPlayer), lDeath); //âàðï â ôóãó Raise(oPlayer); AssignCommand(oPlayer, ActionJumpToLocation(GetLocation(GetObjectByTag("fugue")))); //òðóï object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lDeath); object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1); //óñòàíîâêà ïåðåìåííûõ SetLocalString(oCorpse, "master", GetPCPlayerName(oPlayer)); SetLocalString(oItemcorpse, "master", GetPCPlayerName(oPlayer)); //ãîëä int iGP = GetGold(oPlayer); TakeGoldFromCreature(iGP, oPlayer, TRUE); CreateItemOnObject("NW_IT_GOLD001", oCorpse, iGP); //ëóò int iSlot; int iLoot = d10(1); switch (iLoot){ case 1: iSlot = INVENTORY_SLOT_ARMS; break; case 2: iSlot = INVENTORY_SLOT_BELT; break; case 3: iSlot = INVENTORY_SLOT_BOOTS; break; case 4: iSlot = INVENTORY_SLOT_CLOAK; break; case 5: iSlot = INVENTORY_SLOT_HEAD; break; case 6: iSlot = INVENTORY_SLOT_LEFTHAND; break; case 7: iSlot = INVENTORY_SLOT_LEFTRING; break; case 8: iSlot = INVENTORY_SLOT_NECK; break; case 9: iSlot = INVENTORY_SLOT_RIGHTHAND; break; case 10: iSlot = INVENTORY_SLOT_RIGHTRING; break; default: break; } if (d10(1)>5) { object oLoot = GetItemInSlot(iSlot, oPlayer); CreateItemOnObject(GetResRef(oLoot), oCorpse); DestroyObject(oLoot); |
QUOTE (Lex @ Jan 27 2005, 22:14) |
Скрипт на смерть НПС. НПС исчезает, а на его месте появляется труп на который переносятся все вещи покойного. Сам труп исчезает через 250 секунд. "low_plc_loot" - резреф трупа в палитре. |
Neverwinter Script Source |
//::Created by Лито //::Modificated by Lex void Clear(object oBag = OBJECT_SELF) { object oItem = GetFirstItemInInventory(oBag); while (GetIsObjectValid(oItem)) { DestroyObject(oItem); oItem = GetNextItemInInventory(oBag); } DestroyObject(oBag,1.0); } void main() { string sTemplate = "low_plc_loot"; string sTag = GetTag(OBJECT_SELF); location lLoc = GetLocation(OBJECT_SELF); object oloot = CreateObject(OBJECT_TYPE_PLACEABLE, sTemplate, lLoc, TRUE, sTag); int i = 0; object oItem = GetFirstItemInInventory(OBJECT_SELF); while (GetIsObjectValid(oItem)) { if (GetDroppableFlag(oItem)) CopyObject(oItem,lLoc,oloot); DestoyObject(oItem); oItem = GetNextItemInInventory(OBJECT_SELF); } oItem = GetItemInSlot(i,OBJECT_SELF); while (i<14) { if (GetDroppableFlag(oItem)) CopyObject(oItem,lLoc,oloot); DestoyObject(oItem); i++; oItem = GetItemInSlot(i,OBJECT_SELF); } AssignCommand(oloot,DelayCommand(250.0,Clear(oloot))); } |
Neverwinter Script Source |
//игрока козявит, пока тот окончательно не умрет, козявит в принципе не особо долго, но успеть хелнуть можно void main() { object oPC = GetFirstPC(); effect eDam = EffectDamage(1); while (GetIsObjectValid(oPC) == TRUE) { int iHits = GetCurrentHitPoints(oPC); if (iHits < 1) ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oPC); oPC = GetNextPC(); } } |
Neverwinter Script Source |
//игроку выдается токен винвентарь, ибо случались попытки альта во время даинга, с последующим созданием нового чара и восстановления хит поинтов старому при совпаденииимен(баг игры, практиковался на gem of the north) при ентере игрок умерщвляется за альт void main() { object oPC = GetLastPlayerDying(); CreateItemOnObject("item034", oPC, 1); } |
Neverwinter Script Source |
#include "nw_i0_plot" void Raise(object oPlayer) { effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION); effect eBad = GetFirstEffect(oPlayer); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPlayer); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPlayer)), oPlayer); //Search for negative effects while(GetIsEffectValid(eBad)) { if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS || GetEffectType(eBad) == EFFECT_TYPE_DEAF || GetEffectType(eBad) == EFFECT_TYPE_PARALYZE || GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL) { //Remove effect if it is negative. RemoveEffect(oPlayer, eBad); } eBad = GetNextEffect(oPlayer); } SignalEvent(oPlayer, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE)); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oPlayer); } void main() { object oPlayer = GetLastPlayerDied(); string sArea = GetTag(GetArea(oPlayer)); //если наарене, то варпает к флажку arenaspawn if (sArea == "arena") { Raise(oPlayer); object oSpawnPoint = GetObjectByTag("arenaspawn"); AssignCommand(oPlayer, DelayCommand(1.0, JumpToLocation(GetLocation(oSpawnPoint)))); return; } //Флажок SetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPlayer),"yes"); //Локация location lDeath = GetLocation(oPlayer); SetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPlayer), lDeath); //Варп в фугу, флажок respawn Raise(oPlayer); AssignCommand(oPlayer, DelayCommand(1.0, ActionJumpToLocation(GetLocation(GetObjectByTag("respawn"))))); //Создание трупака и итима трупака в нем object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lDeath); object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1); //Установка переменных SetLocalString(oCorpse, "master", GetPCPlayerName(oPlayer)); SetLocalString(oItemcorpse, "master", GetPCPlayerName(oPlayer)); SetLocalString(GetModule(), "hascorpse" + GetPCPlayerName(oPlayer), "yes"); //Взять золото и положить в труп int iGP = GetGold(oPlayer); AssignCommand(oPlayer, TakeGoldFromCreature(iGP, oPlayer, TRUE)); CreateItemOnObject("NW_IT_GOLD001", oCorpse, iGP); //Вывалить рандомную вещичку из екиперовки если не повезет int iSlot; int iLoot = d10(1); switch (iLoot){ case 1: iSlot = INVENTORY_SLOT_ARMS; break; case 2: iSlot = INVENTORY_SLOT_BELT; break; case 3: iSlot = INVENTORY_SLOT_BOOTS; break; case 4: iSlot = INVENTORY_SLOT_CLOAK; break; case 5: iSlot = INVENTORY_SLOT_HEAD; break; case 6: iSlot = INVENTORY_SLOT_LEFTHAND; break; case 7: iSlot = INVENTORY_SLOT_LEFTRING; break; case 8: iSlot = INVENTORY_SLOT_NECK; break; case 9: iSlot = INVENTORY_SLOT_RIGHTHAND; break; case 10: iSlot = INVENTORY_SLOT_RIGHTRING; break; default: break; } if (d10(1)>5) { object oLoot = GetItemInSlot(iSlot, oPlayer); CreateItemOnObject(GetResRef(oLoot), oCorpse); DestroyObject(oLoot); }} |
Neverwinter Script Source |
void main() { object oPC = GetEnteringObject(); if(GetIsPC(oPC)) { //превращаем игрока в духа effect eGhost = EffectPolymorph(POLYMORPH_TYPE_SPECTRE, TRUE); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oPC); //отбираем токен если он есть object oItem = GetItemPossessedBy(oPC, "deathtoken"); if (GetIsObjectValid(oItem)) DestroyObject(oItem); } } |
Neverwinter Script Source |
void main() { object oPC = GetExitingObject(); effect eEf = GetFirstEffect(oPC); //снимаем полиморф а заодно и все остальное while (GetIsEffectValid(eEf)) { RemoveEffect(oPC, eEf); eEf = GetNextEffect(oPC); } //ищем труп с запомненойлокации и дестроим трупак в инвентаре пласибла, а потом сам пласибл, по умолчанию лут выпадает в виде мешочка location lCorpse = GetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPC)); object oCorpse = GetNearestObjectToLocation(OBJECT_TYPE_PLACEABLE, lCorpse, 1); if (GetTag(oCorpse) == "playercorpse") { object oItemcorpse = GetFirstItemInInventory(oCorpse); while(GetIsObjectValid(oItemcorpse)) { if(GetTag(oItemcorpse) == "corpseitem") DestroyObject(oItemcorpse); oItemcorpse = GetNextItemInInventory(oCorpse); } } DelayCommand(1.0, DestroyObject(oCorpse)); //ставим флажок в выключеное состояние SetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPC),"no"); //говорим, что больше у игрока нет трупа SetLocalString(GetModule(), "hascorpse" + GetPCPlayerName(oPC), "no"); |
Neverwinter Script Source |
void main() { //проверяем альтнулся ли игрок, если да, умерщвляем object oPC = GetEnteringObject(); if (HasItem(oPC, "deathtocken")) { effect death = EffectDeath(TRUE); ApplyEffectToObject(DURATION_TYPE_PERMANENT, death, oPC); } //проверяем флажок и наличие у игрока трупа(в теории локальные переменные после рестарта обнуляются) if((GetCampaignString("deathsystem", "flag" + GetPCPlayerName(oPC)) == "yes")&&(GetLocalString(GetModule(), "hascorpse" + GetPCPlayerName(oPC))!="yes")) { //летим в фугу AssignCommand(oPC, DelayCommand(1.0, ActionJumpToLocation(GetLocation(GetObjectByTag("respawn"))))); //создаем трупак и итем трупак location lDeath = GetCampaignLocation("deathsystem", "location" + GetPCPlayerName(oPC)); object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lDeath); object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1); //показываем кто хозяин всего этого великолепия SetLocalString(oCorpse, "master", GetPCPlayerName(oPC)); SetLocalString(oItemcorpse, "master", GetPCPlayerName(oPC)); } } |
Neverwinter Script Source |
void main() { string sMaster = GetLocalString(OBJECT_SELF, "master"); SpeakString("Здесь покоится " + sMaster, TALKVOLUME_TALK); } |
Neverwinter Script Source |
void main() { //проверяем инвентарь трупа, если итем труп есть, дестроим плесибл труп int i = 0; object oItemcorpse = GetFirstItemInInventory(OBJECT_SELF); while (GetIsObjectValid(oItemcorpse)) { if(GetTag(oItemcorpse) == "corpseitem") i=1; oItemcorpse = GetNextItemInInventory(OBJECT_SELF); } if(i=0) DestroyObject(OBJECT_SELF); } |
Neverwinter Script Source |
void main() { ExecuteScript(GetTag(GetItemActivated()), OBJECT_SELF); } |
Neverwinter Script Source |
void main() { //если не было рестарта, то происходит уже выше описанная процедура создания трупа, если был, ничего не происходит и труп просто исчезает, нужно бежать за нормальным location lPlace = GetItemActivatedTargetLocation(); string sMaster = GetLocalString(GetItemActivated(), "master"); if (sMaster != "") { object oCorpse = CreateObject(OBJECT_TYPE_PLACEABLE, "blueprint032", lPlace); object oItemcorpse = CreateItemOnObject("item369", oCorpse, 1); SetLocalString(oCorpse, "master", sMaster); SetLocalString(oItemcorpse, "master", sMaster); } } |
Neverwinter Script Source |
object oTarget = GetSpellTargetObject(); string sMaster = GetLocalString(oTarget, "master"); if ((sMaster != "")&& (GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE)) { object oRaise = GetFirstPC(); while(GetIsObjectValid(oRaise)) { if(GetPCPlayerName(oRaise) == sMaster) { AssignCommand(oRaise, ActionJumpToLocation(GetLocation(oTarget))); DelayCommand(1.0, DestroyObject(oTarget)); effect eDamage = EffectDamage(GetCurrentHitPoints(oRaise)-1); ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oRaise); } object oRaise = GetNextPC(); } } |
Neverwinter Script Source |
object oTarget = GetSpellTargetObject(); string sMaster = GetLocalString(oTarget, "master"); if ((sMaster != "")&& (GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE)) { object oRaise = GetFirstPC(); while(GetIsObjectValid(oRaise)) { if(GetPCPlayerName(oRaise) == sMaster) { AssignCommand(oRaise, ActionJumpToLocation(GetLocation(oTarget))); DelayCommand(1.0, DestroyObject(oTarget)); } object oRaise = GetNextPC(); } } |
Neverwinter Script Source |
void RemoveHenchman(object oMaster, object oHenchman=OBJECT_SELF) |
Neverwinter Script Source |
void main() { object oMaster = GetEnteringObject(); object oHenchman = GetHenchman(oMaster); if (GetIsPC (oMaster) && !GetLocalInt(OBJECT_SELF, "TRIGER") == 1) { AssignCommand(oHenchman, ActionSpeakString("Я дальше не пойду")); RemoveHenchman(oMaster, oHenchman); SetLocalInt(OBJECT_SELF, "TRIGER", 1); SetLocalInt(oHenchman, "TRUS", 1); // устанавливаем локалку, а на ветке // диалога, где хенча можно обратно взять, ставим проверку на эту локалку } } |
QUOTE (zmey @ Jul 21 2005, 11:01) |
как сделать, чтобы непись после диалога ушёл В ДРУГУЮ ЛОКАЦИЮ, НЕ СМЕЖНУЮ С ИСХОДНОЙ? |
Neverwinter Script Source |
void ActionMoveToLocation(location lDestination, int bRun=FALSE) // location lDestination - задается сама локация, куда идти // int bRun - собственно TRUE включает бег, FALSE отключает бег... |