Помощь - Поиск - Пользователи - Календарь
Полная версия: nwnx2 - проблемы
Город Мастеров > РЕДАКТОРЫ > Шарды рунета
baskan
Требуется сделать проверку в OnClientEnter на существование аккаунта в БД.

Скрипт :

Neverwinter Script Source
#include "nw_o0_itemmaker"
#include "hss_giv_it_class"
#include "gsc_include"
#include "aps_include"
#include "_cb_core"

void main()
{
object oPC = GetEnteringObject();
object oStore = GetModule();
string sStoreName = GetName(oPC)+GetPCPlayerName(oPC); // =[PC name] + [login name]
SetLocalString(oPC,"HP_MyIdString",sStoreName);

//Remove Polymorph and Spell_Failure
effect eNeg = GetFirstEffect(oPC);
while(GetIsEffectValid(eNeg))
{
if (GetEffectType(eNeg)==EFFECT_TYPE_POLYMORPH) RemoveEffect(oPC, eNeg);
if (GetEffectType(eNeg)==EFFECT_TYPE_SPELL_FAILURE) RemoveEffect(oPC, eNeg);
eNeg = GetNextEffect(oPC);
}


int iSavedHP = GetLocalInt(oStore,sStoreName);
if (iSavedHP != 0)
{
effect efDamage = EffectDamage(GetMaxHitPoints(oPC)-iSavedHP,DAMAGE_TYPE_MAGICAL,DAMAGE_POWER_ENERGY);
ApplyEffectToObject(DURATION_TYPE_INSTANT,efDamage,oPC);
}

int k,j,nSpells;
for (k=1; k < 805; k++)
{
nSpells = GetLocalArrayInt(oStore,sStoreName+"_spells",k);
if (nSpells)
for (j=0; j <= GetHasSpell(k,oPC)-nSpells; j++)
DecrementRemainingSpellUses(oPC, k);
}

if (!GetIsDM(oPC))
{
if(GetItemPossessedBy(oPC, "dmfi_pc_emote") == OBJECT_INVALID)
CreateItemOnObject("dmfi_pc_emote", oPC);
if (!GetXP(oPC))
{
ClearInventory(oPC);
GiveClassItems(oPC);
GiveGoldToCreature(oPC, 900);
CreateItemOnObject("bedroll", oPC);
CreateItemOnObject("food", oPC);
GiveXPToCreature(oPC,1);
}
if ((GetCampaignInt("INVA_MISK", "EXISTS", oPC)==TRUE)&&(!GetLocalInt(GetModule(),"SecurityDisable")))
{
BootPC(oPC);
}
    if(GetLocalInt(oPC, "Subrace_Done") != 1)
    {
        core(oPC);
        SetLocalInt(oPC, "Subrace_Done", 1);
    }
// ____________________________CHECKING_ACCOUNT____________________________


object oPC=GetEnteringObject();
string sAccount=SQLEncodeSpecialChars(GetPCPlayerName(oPC));
string sKey=GetPCPublicCDKey(oPC);

string sCheck = "SELECT * FROM `IPB` WHERE nwn_acc='"+sAccount+"' AND nwn_access='accessed'";
string sCheckKey = "SELECT nwn_key FROM `ipb` WHERE nwn_acc='"+sAccount+"' AND nwn_access='accessed'";
string sPutDownKey = "UPDATE `IPB` SET nwn_key='"+GetPCPublicCDKey(oPC)+"' WHERE nwn_acc='"+sAccount+"' AND nwn_access='accessed'";


SQLExecDirect(sCheck);
if (SQLFirstRow() == SQL_SUCCESS)
{
SQLExecDirect(sCheckKey);
string sFinalKey;
while (SQLFetch() == SQL_SUCCESS)
{
sFinalKey = SQLGetData(1);
}
if(sFinalKey == "")
{
SQLExecDirect(sPutDownKey);
}
else if((sFinalKey != "") && (sFinalKey != GetPCPublicCDKey(oPC)))
{
BootPC(oPC);
}
else if(sFinalKey == GetPCPublicCDKey(oPC))
{
SendMessageToPC(oPC,"checking success...");
}
}
else
{
BootPC(oPC);
}
//ExecuteScript("_security",OBJECT_SELF);
// _____________________END_OF_CHECKING_ACCOUNT____________________________
ExecuteScript("hit_autodis",oPC);
ExecuteScript("hit_chkname",oPC);
}
SendMessageToPC(oPC, "The Chronicles of Nightfall 0.9b");
SendMessageToAllDMs("Account: " + GetPCPlayerName(oPC)+ ", Character: "+ GetName(oPC)+ ", IP: "+ GetPCIPAddress(oPC));
WriteTimestampedLogEntry("Account: " + GetPCPlayerName(oPC)+ ", Character: "+ GetName(oPC)+ ", IP: "+ GetPCIPAddress(oPC));
GSC_OnClientEnter(oPC);
}

Нас интересует промежуток от CHECKING_ACCOUNT до END_OF_CHECKING_ACCOUNT. "ipb" имя БД. Ошибка кроеться в этом промежутке. Ибо когда я его закоментил скрипт нормально работал, а так при старте выдает ошибку о "Слишком много инструкций" и не показывает на какой строке black eye.gif . логи nwnx2 ничего не показывают, помогите.swoon.gif
-fenix-
baskan, я в nwnx2 не шарю, но бегло пробежав, вот что заметил.
Neverwinter Script Source
while (SQLFetch() == SQL_SUCCESS)
{
sFinalKey = SQLGetData(1);
}

Где выход из цикла?
При выполнении условия, он утебя бесконечный.
2_advanced
фетч перемещает на следующую строку.. если пусто, то выход из цикла.

зы. я 3 раза уже выкладывал тут сабж для хранения всей инфы о чарах в sql
ни у кого не осталось?
virusman
Извратно написано, но должно работать.
Первое, что приходит в голову - заменить в
Neverwinter Script Source
while (SQLFetch() == SQL_SUCCESS)
{
    sFinalKey = SQLGetData(1);
}

while на if.
Меньше циклов - меньше геморроя. smile.gif
Добавлено в [mergetime]1134326572[/mergetime]
Хм..
Инициализация NWNX делается при загрузке модуля?
[MoF]Darth_Nick
дело не в скрипте...
"Эти слишком много инструкций " будут если нету связи с БД...для тецта, ставим скрипт на ОнЕнтер: http://nwnres.nm.ru/_cl_enter.html
создаем там бд nwn, табло player, вписываем nwn_acc,nwn_access,nwn_key.
Пробуем через nwnx - работает
Пробуем через сингл(или сервом без nwnx) к примеру и получаем "Эти слишком много инструкций "
=> если nwnx криво настроен(или вообще не настроен shok.gif), то будет ета хрень

2_advanced
куда интересней самому написать smile.gif
Vanes
кстати через сингл запускать модуль, то у меня нвн просто напросто виснет, как раз из-за nwnx...
ну я его правда и не настраивал... уже привык скрипты с запросами к БД вообще не тестить, а для остального отключать скрипты на ModuleLoad и ClientEnter...
Richard
Вобщем немного мы продвинулись, но опять попали в тупик.
1. Инициализация онлоад
CODE

#include "aps_include"

void main()
{
   // Init placeholders for ODBC gateway
   SQLInit();
}


2. Он клиент ентер проверка

CODE

// ____________________________CHECKING_ACCOUNT____________________________

// Main vars
object oPC=GetEnteringObject();
string sAccount=SQLEncodeSpecialChars(GetPCPlayerName(oPC));
//string sKey=GetPCPublicCDKey(oPC);
// SQL's queries
string sCheck = "SELECT * FROM `ipb` WHERE nwn_acc='"+sAccount+"' AND nwn_access='accessed'";
//string sCheckKey = "SELECT nwn_key FROM `ipb` WHERE nwn_acc='"+sAccount+"' AND nwn_access='accessed'";
//string sPutDownKey = "UPDATE `ipb` SET nwn_key='"+GetPCPublicCDKey(oPC)+"' WHERE nwn_acc='"+sAccount+"' AND nwn_access='accessed'";
// Let's move to actions
SQLExecDirect(sCheck);
if (SQLFirstRow() == SQL_SUCCESS)
{
//SQLExecDirect(sCheckKey);
//string sFinalKey;
//while (SQLFetch() == SQL_SUCCESS)
//{
//sFinalKey = SQLGetData(1);
//}
//if(sFinalKey == "")
//{
//SQLExecDirect(sPutDownKey);
//}
//else if((sFinalKey != "") && (sFinalKey != GetPCPublicCDKey(oPC)))
//{
//BootPC(oPC);
//}
//else if(sFinalKey == GetPCPublicCDKey(oPC))
//{
//SendMessageToPC(oPC,"ooe ciaao eae...ii y caoie =?");
//}
}
else
{
BootPC(oPC);
}
ExecuteScript("_security",OBJECT_SELF);
// _____________________END_OF_CHECKING_ACCOUNT____________________________



Вроде бы все хорошо.

При инициализации nwnx в лог ODBC пишется Database connection up
То есть все ок.

В чем может быть трудность?
Добавлено в [mergetime]1134738338[/mergetime]
Пускает на сервер всех игроков, то есть проверку не производит.
Регистрация через форум по аналогу [MoF]Darth_Nick
[MoF]Darth_Nick
CODE

string sCheck = "SELECT * FROM `ipb` WHERE nwn_acc='"+sAccount+"' AND nwn_access='accessed'";
//string sCheckKey = "SELECT nwn_key FROM `ipb` WHERE nwn_acc='"+sAccount+"' AND nwn_access='accessed'";
//string sPutDownKey = "UPDATE `ipb` SET nwn_key='"+GetPCPublicCDKey(oPC)+"' WHERE nwn_acc='"+sAccount+"' AND nwn_access='accessed'";

заменить на
CODE

string sCheck = "SELECT * FROM `ibf_members` WHERE nwn_acc='"+sAccount+"' AND nwn_access='accessed'";
//string sCheckKey = "SELECT nwn_key FROM `ibf_members` WHERE nwn_acc='"+sAccount+"' AND nwn_access='accessed'";
//string sPutDownKey = "UPDATE `ibf_members` SET nwn_key='"+GetPCPublicCDKey(oPC)+"' WHERE nwn_acc='"+sAccount+"' AND nwn_access='accessed'";

ibf_ - стандартный префикс
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2024 Invision Power Services, Inc.