Level 10
  
Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]

|
На ваульте полно Сервер-статус-чекеров, но они берут инфу когда снифят трафик от сервака к серверу Bioware. В нашем НВН сервере есть такая галочка "Post game to Inernet", которую самому поставить нельзя, а если интернет у сервера не доступен (например, в локальной сети) то, это галочка убирается, траффик от сервера не передается, и следовательно все PHP скрипты для статуса, не работают. Но у меня появилась идея сделать статус сервера с помощью APS/NWNX2 и базы данных MySQL. [MoF]Darth_Nick написал еще для нее PHP скрипт который будет брать данные из MySQL.
Статус позволяет видеть:
- Количество игроков на сервере - Их имена (зачем MoF]Darth_Nick'у нужны аккаунты - понятия не имею, но я чуть модифицировал его скрипт - если вам нужны аккаунты см. в теме "Статус Сервера через PHP страницу" Итак, для начала мои скрипты: - Пол - Раса и Подраса - Уровень - Классы и уровень каждого класса - PC или DM
Теперь скрипты:
OnModuleLoad
Neverwinter Script Source | /* //////////////////////////////// //////Created By: Avaddon////// //////Date: 28. 11. 2004////// ///////////////////////////// \\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\MYSQL SERVER STATUS\\\\\\\ \\\\\\Put this script:\\\\\\\\\ \\\\\\\"OnModuleLoad"\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ */ #include "aps_include" void main() { //СтандартаЯ команда в "aps_onload" SQLInit();
//Команда MySQL "Создать таблицу REG_DATA" string sSQL="CREATE TABLE `reg_data` ("+ " `pc_dm` varchar(64) NOT NULL default '',"+ " `login` varchar(64) NOT NULL default '',"+ " `name` varchar(64) NOT NULL default '',"+ " `gender` varchar(10) NOT NULL default '',"+ " `race` varchar(64) NOT NULL default '',"+ " `sub_race` varchar(100) NOT NULL default '',"+ " `levels` varchar(3) NOT NULL default '',"+ " `class_1` varchar(64) NOT NULL default '',"+ " `class_2` varchar(64) NOT NULL default '',"+ " `class_3` varchar(64) NOT NULL default '',"+ " `deity` varchar(100) NOT NULL default '',"+ " `cd_key` varchar(64) NOT NULL default '',"+ " `ip` varchar(25) NOT NULL default '',"+ " `line_status` varchar(4) NOT NULL default '',"+ " `creation_date` datetime NOT NULL default '0000-00-00 00:00:00',"+ ") TYPE=MyISAM;";
/*Команда MySQL "Выставить line_status" на "off", везде где он = "on". ИспользуетсЯ при загрузке модулЯ длЯ обновлениЯ статистики после краша или выключениЯ сервера. */ string sOffline = "UPDATE `reg_data` SET line_status = 'off' WHERE line_status='on'";
//ПроверЯем есть ли таблица REG_DATA SQLExecDirect("DESCRIBE reg_data");
//Если таблицы нет - создаем ее if (SQLFetch()!= SQL_SUCCESS) { SQLExecDirect(sSQL); } //При загрузке модулЯ всем выставлЯем статус "Offline" SQLExecDirect(sOffline); } |
OnClientEnter
Neverwinter Script Source | /* //////////////////////////////// //////Created By: Avaddon////// //////Date: 28. 11. 2004////// ///////////////////////////// \\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\MYSQL SERVER STATUS\\\\\\\ \\\\\\Put this script:\\\\\\\\\ \\\\\\\"OnClentEnter"\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ */ #include "aps_include" void main() { object oPC=GetEnteringObject(); string sName=SQLEncodeSpecialChars(GetName(oPC));//ИМЯ персонажа string sLogin=SQLEncodeSpecialChars(GetPCPlayerName(oPC)); // Логин игрока string sGender="Мужской"; if(GetGender(oPC)==GENDER_FEMALE)sGender="Женский";//Пол string sKey=GetPCPublicCDKey(oPC); //CD-key игрока string sIp=GetPCIPAddress(oPC); //Ip игрока string sDeity=GetDeity(oPC); //Божество игрока string sPC_DM = "PC"; if (GetIsDM(oPC)==TRUE)sPC_DM = "DM";////ДМ или Игрок string sSubrace=GetStringLeft(GetSubRace(oPC), 99);//Подраса игрока string sAllLevels = IntToString(GetHitDice(oPC)); //Расы заносимые при регистрации в БД//////////////////////// string sRace; // int iRace = GetRacialType(oPC); // switch (iRace) // { // case RACIAL_TYPE_DWARF: // sRace = "Дворф"; // break; // // case RACIAL_TYPE_ELF: // sRace = "Эльф"; // break; // // case RACIAL_TYPE_GNOME: // sRace = "Гном"; // break; // // case RACIAL_TYPE_HALFELF: // sRace = "Полуэльф"; // break; // // case RACIAL_TYPE_HALFLING: // sRace = "Полурослик"; // break; // // case RACIAL_TYPE_HALFORC: // sRace = "Полуорк"; // break; // // case RACIAL_TYPE_HUMAN: // sRace = "Человек"; // break; // } // /////////////////////////////////////////////////////////////
//Классы игрока/////////////////////////////////////////// int iNum; // for (iNum=0; iNum<4; iNum++) { string sClass; // int iClass = GetClassByPosition(iNum,oPC); // switch (iClass) // { // case CLASS_TYPE_ARCANE_ARCHER: // sClass = "Тайный Стрелок"; // break; // // case CLASS_TYPE_ASSASSIN: // sClass = "Убийца"; // break; // // case CLASS_TYPE_BARBARIAN: // sClass = "Варвар"; // break; // // case CLASS_TYPE_BARD: // sClass = "Бард"; // break; // // case CLASS_TYPE_BLACKGUARD: // sClass = "Страж Тьмы"; // break; // // case CLASS_TYPE_CLERIC: // sClass = "Клирик"; // break; // // case CLASS_TYPE_DIVINECHAMPION: // sClass = "Чемпион Торма"; // break; // // case CLASS_TYPE_DRAGONDISCIPLE: // sClass = "Ученик Дракона"; // break; // // case CLASS_TYPE_DRUID: // sClass = "Друид"; // break; // // case CLASS_TYPE_DWARVENDEFENDER: // sClass = "Защитник Дворфов"; // break; // // case CLASS_TYPE_FIGHTER: // sClass = "Воин"; // break; // // case CLASS_TYPE_HARPER: // sClass = "Разведчик Арфистов"; // break; // // case CLASS_TYPE_INVALID: // sClass = " - "; // break; // // case CLASS_TYPE_MONK: // sClass = "Монах"; // break; // // case CLASS_TYPE_PALADIN: // sClass = "Паладин"; // break; // // case CLASS_TYPE_PALEMASTER: // sClass = "Бледный Мастер"; // break; // // case CLASS_TYPE_RANGER: // sClass = "Следопыт"; // break; // // case CLASS_TYPE_ROGUE: // sClass = "Плут"; // break; // // case CLASS_TYPE_SHADOWDANCER: // sClass = "Танцор Тени"; // break; // // case CLASS_TYPE_SHIFTER: // sClass = "Оборотень"; // break; // // case CLASS_TYPE_SORCERER: // sClass = "Волшебник"; // break; // // case CLASS_TYPE_WEAPON_MASTER: // sClass = "Мастер Оружий"; // break; // // case CLASS_TYPE_WIZARD: // sClass = "Маг"; // break; // } // //////////////////////////////////////////////////////////
//Берем класс данной позиции и заносим его в локальную строку SetLocalString(oPC,"Class"+IntToString(iNum),sClass);// //Берем уровень данного класса и заносим его в локальную строку SetLocalString(oPC,"Level"+IntToString(iNum),IntToString(GetLevelByPosition(iNum,oPC)));//; } //Читаем уровни 1,2, и 3 класса string sLevel1 = GetLocalString(oPC,"Level1"); string sLevel2 = GetLocalString(oPC,"Level2"); string sLevel3 = GetLocalString(oPC,"Level3");
//Читаем 1,2, и 3 класс string sClass_1 = GetLocalString(oPC,"Class1")+" ("+sLevel1+")"; string sClass_2 = GetLocalString(oPC,"Class2")+" ("+sLevel2+")"; string sClass_3 = GetLocalString(oPC,"Class3")+" ("+sLevel3+")";
//Выполним запрос SQL - выбираем строчку где логин и чар-нейм = логин и ИМЯ персонажа вошедшего игрока string sSelect = "SELECT * FROM `reg_data` WHERE login='"+GetPCPlayerName(oPC)+ "' AND name='" +GetName(oPC)+ "' AND pc_dm='"+sPC_DM+"'";
//Команда MySQL "Выставить вощдшему игроку статус OnLine" string sLine_Status = "UPDATE `reg_data` SET line_status = 'on' WHERE login='"+GetPCPlayerName(oPC)+ "' AND name='" +GetName(oPC)+ "' AND pc_dm='"+sPC_DM+"'";
//Регистрируем игрока статус - регистред, логин, чар-нейм, пол, раса, классы (1,2,3), подраса, сд-кей, ip, и дата регистрации string sReg="INSERT INTO reg_data (pc_dm, login, name, gender,"+ "race, sub_race,levels, class_1,class_2,class_3, deity,cd_key,ip,line_status,creation_date) "+ "VALUES('"+sPC_DM+ "','"+sLogin+ "','"+sName+ "','"+sGender+ "','"+sRace+ "','"+sSubrace+ "','"+sAllLevels+ "','"+sClass_1+ "','"+sClass_2+ "','"+sClass_3+ "','"+sDeity+ "','"+sKey+ "','"+sIp+ "','on',NOW())";
//Проверка на статус игрока (зарегистрирован или нет) SQLExecDirect(sSelect); if (SQLFirstRow() == SQL_SUCCESS) { SendMessageToPC(oPC,"Статус изменен на [On Line]"); //Если да - просто изменЯем статус на OnLine SQLExecDirect(sLine_Status); } else { //Если нет - регистрируем, и выставлЯем статус OnLine SQLExecDirect(sReg); SendMessageToPC(oPC,"Приветствуем Вас! Вас персонаж был автоматически зарегистрирован!"); SendMessageToPC(oPC,"Статус изменен на [On Line]"); }
//Задаем локальные строки игроку с его логином и именем SetLocalString(oPC,"Login",GetPCPlayerName(oPC)); SetLocalString(oPC,"Name",GetName(oPC)); } |
OnClientLeave
Neverwinter Script Source | /* //////////////////////////////// //////Created By: Avaddon////// //////Date: 28. 11. 2004////// ///////////////////////////// \\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\MYSQL SERVER STATUS\\\\\\\ \\\\\\Put this script:\\\\\\\\\ \\\\\\\"OnClentLeave"\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ */ #include "aps_include" void main() { object oPC=GetExitingObject();
// Считываем имЯ игрока с его локальной строчки заданной при входе на сервер string sName=SQLEncodeSpecialChars(GetLocalString(oPC,"Name"));
// Считываем логин игрока с его локальной строчки заданной при входе на сервер string sLogin=SQLEncodeSpecialChars(GetLocalString(oPC,"Login")); string sPC_DM = "PC"; if (GetIsDM(oPC)==TRUE)sPC_DM = "DM";////ДМ или Игрок // //Выполним запрос SQL - выбираем строчку где логин и чар-нейм = логин и ИМЯ персонажа ушедшего игрока string sSelect = "SELECT * FROM `reg_data` WHERE login='"+sLogin+ "' AND name='" +sName+ "' AND pc_dm='"+sPC_DM+"'";
//Команда MySQL "Изменить "line_status" на "off", где логин и имЯ = логину и имени ушедшего игрока. string sLine_Status = "UPDATE `reg_data` SET line_status = 'off' WHERE login='"+sLogin+ "' AND name='" +sName+ "' AND pc_dm='"+sPC_DM+"'";
SQLExecDirect(sSelect); if (SQLFirstRow() == SQL_SUCCESS) { SendMessageToPC(oPC,"Статус изменен на [Off Line]"); SQLExecDirect(sLine_Status); } } |
Сообщение отредактировал Twin - Jan 9 2005, 17:24
|