Level 5
Класс: Страж Тьмы
Характер: Chaotic Neutral
Раса: Дракон
NWN: Скриптинг [PW]
|
СЕРИЯ "СКРИПТЫ ДЛЯ ШАРДА" ЦИКЛ "СКРИПТЫ RIPPER'a"
Я написал пару простых, но очень полезный скриптов для шардов, на них "нанизываются" все остальные примочки. Что я сделал:- Индексацию игроков
- Защита их аккаунтов от взлома
- Сохранение локации и координат игрока после рестарта сервера
- ДМ палка для управления игроками
Все скрипты взаимосвязанны. pl_onlogon.nss (поставить в OnClientEnter модуля) Neverwinter Script Source | // =========================================== // pl_on_logon.nss 12.12.04 // © RiPPeR // glebkk@xaker.ru // ===========================================
#include "main_spirit"
void main() { object oPlayer = GetEnteringObject(); object oSpirit = GetPlayerSpirit(oPlayer); string ID = IntToString(GetLocalInt(oSpirit, "ID")); string sAccount = GetPCPlayerName(oPlayer);
string sDB_CDKEY = GetCampaignString("db",sAccount+"_CDKEY"); string sPC_CDKEY = GetPCPublicCDKey(oPlayer);
if (GetStringLength(sDB_CDKEY) <= 1) //Нет записи в базе данных SetCampaignString("db",sAccount+"_CDKEY",sPC_CDKEY); else if (sDB_CDKEY != sPC_CDKEY) BootPC(oPlayer);
if (oSpirit == OBJECT_INVALID) //Новый персонаж { oSpirit = CreateItemOnObject("spirit", GetEnteringObject(), 1);
int nCounter = GetCampaignInt("db","pl_Counter") + 1;
SetLocalInt(oSpirit,"ID",nCounter); SetCampaignInt("db","pl_Counter",nCounter);
ID = IntToString(nCounter); } else //Старый { }
SetLocalInt(oSpirit,"bFlaged",1); SetLocalInt(oSpirit,"bConnected",1); } |
pl_on_logoff.nss (поставить в OnClientLeave модуля)
Neverwinter Script Source | // =========================================== // pl_on_logoff.nss 12.12.04 // © RiPPeR // glebkk@xaker.ru // ===========================================
#include "main_spirit"
void main() { object oPlayer = GetExitingObject(); object oSpirit = GetPlayerSpirit(oPlayer);
string ID = IntToString(GetLocalInt(oSpirit,"ID"));
SetLocalInt(oSpirit,"bConnected",0); } |
default.nss
Neverwinter Script Source | // =========================================== // default.nss 12.12.04 // © RiPPeR // glebkk@xaker.ru // ===========================================
#include "main_spirit"
void main() { object oPlayer = OBJECT_SELF; object oSpirit = GetPlayerSpirit(oPlayer);
vector vPos = GetPosition(oPlayer);
if (GetLocalInt(oSpirit,"bFlaged") == 0) { SetLocalFloat(oSpirit,"pos_x",vPos.x); SetLocalFloat(oSpirit,"pos_y",vPos.y); SetLocalFloat(oSpirit,"pos_z",vPos.z); SetLocalFloat(oSpirit,"pos_angle",VectorToAngle(vPos)); } else SetLocalInt(oSpirit,"bFlaged",0); } |
main_spirit.nss (просто инклуд)
Neverwinter Script Source | // =========================================== // main_spirit.nss 12.12.04 // © RiPPeR // glebkk@xaker.ru // ===========================================
object GetPlayerSpirit(object oPlayer);
object GetPlayerSpirit(object oPlayer) { object oItem = GetFirstItemInInventory(oPlayer);
if (GetResRef(oItem) == "spirit") return oItem;
while(oItem != OBJECT_INVALID) { oItem = GetNextItemInInventory(oPlayer);
if (GetResRef(oItem) == "spirit") return oItem; } return OBJECT_INVALID; } |
main_active_item.nss
Neverwinter Script Source | // =========================================== // main_active_item.nss 12.12.04 // © RiPPeR // glebkk@xaker.ru // ===========================================
#include "main_spirit"
void main() { object oPlayer = GetItemActivator(); object oItem = GetItemActivated(); object oTarget = GetItemActivatedTarget();
string sResRef = GetResRef(oItem); string sTag = GetTag(oItem);
if (sResRef == "dm_wand") //if (GetIsDM(oPlayer)) //Раскомментировать, если ДМ-палку может использовать только ДМ { AssignCommand(oPlayer,ActionStartConversation(oPlayer,"dm_wand_pl_list",TRUE,FALSE)); ExecuteScript("dm_ban_info",oPlayer); SpeakString("DM_WAND ACT",TALKVOLUME_SHOUT); } } |
m_def_loc_enter.nss (ставить на OnEnter _всех_ локаций, _кроме_ стартовой)
Neverwinter Script Source | // =========================================== // m_def_loc_enter.nss 12.12.04 // © RiPPeR // glebkk@xaker.ru // ===========================================
#include "main_spirit"
void main() { object oArea = OBJECT_SELF; object oPlayer = GetEnteringObject(); object oSpirit = GetPlayerSpirit(oPlayer);
string sTag = GetTag(oArea); string sResRef = GetResRef(oArea);
SetLocalString(oSpirit, "pos_area", sTag); ExecuteScript(sResRef,oArea); //Раскомментироваться для запуска OnEnter локи скрипта с именем - рес-реф'ом локи } |
m_loc_saver.nss Сделать локацию 2х2. Туда поставить таким образом триггеры:
= - Тригеры для перехода * - Тригер с этим скриптом
В центре тригера со скриптом поставить стартовый вэйпоинт.
Neverwinter Script Source | // =========================================== // m_loc_saver.nss 12.12.04 // © RiPPeR // glebkk@xaker.ru // ===========================================
#include "main_spirit"
void main() { object oPlayer = GetEnteringObject(); object oSpirit = GetPlayerSpirit(oPlayer);
vector vPlayer; location lPlayer; object oArea;
float x = GetLocalFloat(oSpirit,"pos_x"); float y = GetLocalFloat(oSpirit,"pos_y"); float z = GetLocalFloat(oSpirit,"pos_z"); float angle = GetLocalFloat(oSpirit,"pos_angle");
string sArea = GetLocalString(oSpirit,"pos_area");
vPlayer = Vector(x,y,z); oArea = GetObjectByTag(sArea);
lPlayer = Location(oArea,vPlayer,angle);
SetLocalInt(oSpirit,"bConnected",1); AssignCommand(oPlayer,ActionJumpToLocation(lPlayer)); } |
dm_ban_boot.nss
Neverwinter Script Source | // =========================================== // dm_ban_boot.nss 12.12.04 // © RiPPeR // glebkk@xaker.ru // ===========================================
#include "main_spirit"
void main() { int nID = GetLocalInt(OBJECT_SELF,"DM_WAND_ID");
object oPlayer = GetFirstPC(); object oSpirit;
while (oPlayer != OBJECT_INVALID) { oSpirit = GetPlayerSpirit(oPlayer);
if (GetLocalInt(oSpirit,"ID") == nID) { BootPC(oPlayer); break; } } } |
dm_ban_info.nss
Neverwinter Script Source | // =========================================== // dm_ban_info.nss 12.12.04 // © RiPPeR // glebkk@xaker.ru // ===========================================
#include "main_spirit"
string PlayerList(object oPC); object GetPCByPlaceNum(int num); int GetPCAmount();
string GetGoodEvil(object oPC); string GetLawChaotic(object oPC);
void main() { int num = GetLocalInt(OBJECT_SELF,"DM_WAND_NUM"); int player_amount = GetPCAmount();
if (num == 0) num = player_amount;
if (num > player_amount) num = 1;
object oPC = GetPCByPlaceNum(num); int ID = GetLocalInt(GetPlayerSpirit(oPC),"ID");
SetLocalInt(OBJECT_SELF,"DM_WAND_NUM",num); SetLocalInt(OBJECT_SELF,"DM_WAND_ID",ID);
string sPlayerList = PlayerList(oPC);
SetCustomToken(1999, sPlayerList); }
string PlayerList(object oPC) { //object oPC = GetFirstPC(); string Text = " Информация о персонаже \n";
string Account = GetPCPlayerName(oPC); string Name = GetName(oPC); string ID = IntToString(GetLocalInt(GetPlayerSpirit(oPC),"ID")); string CD_KEY = GetPCPublicCDKey(oPC); string IP = GetPCIPAddress(oPC);
string Level = IntToString(GetLevelByPosition(1, oPC) + GetLevelByPosition(2, oPC) + GetLevelByPosition(3, oPC)); string BadGood = GetGoodEvil(oPC); string ChaoticLaw = GetLawChaotic(oPC); string ThisHP = IntToString(GetCurrentHitPoints(oPC)); string MaxHP = IntToString(GetMaxHitPoints(oPC)); string AC = IntToString(GetAC(oPC));
string Area = GetName(GetArea(oPC));
Text += "<cццц>"+"-----------------------------\n"; Text += "<cццц>"+"Аккаунт: "+"<cк>"+Account+"\n"; Text += "<cццц>"+"Имя персонажа: "+"<cк>"+Name+"\n"; Text += "<cццц>"+"ID: "+"<cк>"+ID+"\n"; Text += "<cццц>"+"PUBLIC CD KEY: "+"<cк>"+CD_KEY+"\n"; Text += "<cццц>"+"IP: "+"<cк>"+IP+"\n"; Text += "<cццц>"+"\n"; Text += "<cццц>"+"Уровень: "+"<cк>"+Level+"\n"; Text += "<cццц>"+"Хороший/Злой: "+"<cк>"+BadGood+"\n"; Text += "<cццц>"+"Хаотичный/Порядочный: "+"<cк>"+ChaoticLaw+"\n"; Text += "<cццц>"+"HP: "+"<cк>"+ThisHP+"/"+"<cк>"+MaxHP+"\n"; Text += "<cццц>"+"AC: "+"<cк>"+AC+"\n"; Text += "<cццц>"+"Локация: "+"<cк>"+Area+"\n";
return Text; }
object GetPCByPlaceNum(int num) { object oPC = GetFirstPC(); int num2 = 0;
for (num2 = 0; num2 < num - 1; num2++) oPC = GetNextPC();
return oPC; }
int GetPCAmount() { object oPC = GetFirstPC(); int num = 0;
while (oPC != OBJECT_INVALID) { num++; oPC = GetNextPC(); }
return num; }
string GetGoodEvil(object oPC) { int ret = GetAlignmentGoodEvil(oPC);
if (ret == ALIGNMENT_GOOD) return "GOOD";
if (ret == ALIGNMENT_EVIL) return "EVIL";
if (ret == ALIGNMENT_NEUTRAL) return "NEUTRAL";
return "OBJECT_INVALID"; }
string GetLawChaotic(object oPC) { int ret = GetAlignmentLawChaos(oPC);
if (ret == ALIGNMENT_LAWFUL) return "LAWFUL";
if (ret == ALIGNMENT_CHAOTIC) return "CHAOTIC";
if (ret == ALIGNMENT_NEUTRAL) return "NEUTRAL";
return "OBJECT_INVALID"; } |
dm_ban_minus.nss
Neverwinter Script Source | // =========================================== // dm_ban_minus.nss 12.12.04 // © RiPPeR // glebkk@xaker.ru // ===========================================
void main() { SetLocalInt(OBJECT_SELF,"DM_WAND_NUM",GetLocalInt(OBJECT_SELF,"DM_WAND_NUM") - 1); ExecuteScript("dm_ban_info",OBJECT_SELF); ExecuteScript("dm_w_return",OBJECT_SELF); } |
dm_ban_plus.nss
Neverwinter Script Source | // =========================================== // dm_ban_plus.nss 12.12.04 // © RiPPeR // glebkk@xaker.ru // ===========================================
void main() { SetLocalInt(OBJECT_SELF,"DM_WAND_NUM",GetLocalInt(OBJECT_SELF,"DM_WAND_NUM") + 1); ExecuteScript("dm_ban_info",OBJECT_SELF); ExecuteScript("dm_w_return",OBJECT_SELF); } |
dm_w_return.nss
Neverwinter Script Source | // =========================================== // dm_w_return.nss 12.12.04 // © RiPPeR // glebkk@xaker.ru // ===========================================
void main() { ExecuteScript("dm_ban_info",OBJECT_SELF); AssignCommand(OBJECT_SELF,ActionStartConversation(OBJECT_SELF,"dm_wand_pl_list",TRUE,FALSE)); } |
Для работы скриптов ДМ-посоха нужно: Создать любой итем с рес-реф'ом "dm_wand" и Уник Повером. Создать диалог dm_wand_pl_list
Структура диалога:
CODE | [OWNER] - <CUSTOM1999> | Запутить (ActionTaken - dm_ban_boot) Следующий игрок (ActionTaken - dm_ban_plus) Предыдущий игрок (ActionTaken - dm_ban_minus) Выход
|
Это чисто пример по созданию посоха, можно легко модернизировать во что-то оч. хорошее :). Дерзайте Кроме того обязательно нужно создать в палитре новый итем с тагом "Spirit", ResRef'ом "spirit", Undropablep.s. у кого проблемы с установкой пишите в приват. МОДУЛЬ МОЖНО СКАЧАТЬ ТУТ
Сообщение отредактировал RiPPeR - Apr 30 2005, 07:49
|