Помощь - Поиск - Пользователи - Календарь
Полная версия: Наболевший вопрос
Город Мастеров > РЕДАКТОРЫ > Шарды рунета
Jurt
Помогите кто сталкивался с подобным:

На onClientEnter вешаю скрипт перетряхивающий базу и либо пропускающий плеера либо нет, если игрок проходит в игру ему восстанавливаем некоторые переменные.

А теперь вопрос:
Пишу SetLocalInt(oPC,"bla",1), а локальная переменная не плеере не устанавливается unsure.gif как это побороть? Сделал пока через базу, но мне жалко игроков которым придется жить с лагами от постоянного обращения к базе.
_kaa_
Давай весь код, переменные на PC без проблем всегда вешались.
Jurt
на OnClientEnter модуля висит следующая скриптина:
Neverwinter Script Source
#include "aps_include"
void main()
{
  object oPC = GetEnteringObject();
  object oAUS;
  string sName = GetPCPlayerName(oPC);
  string sPCName;
  string PCTag;
  string PCid;
  int PCRespect;
  string sPClocal,t4,t5;
  if (GetIsPC(oPC))
  {
    SQLExecDirect("SELECT * FROM pl_data WHERE name='"+sName+"' AND pass= MD5('"+GetDeity(oPC)+"')");
    SendMessageToPC(oPC,"name:"+sName);
    if (SQLFetch()==1)
    {

        PCid=SQLGetData(1);
        sPCName=SQLGetData(2);
        PCTag=SQLGetData(3);

        SQLExecDirect("SELECT * FROM pl_stat WHERE id='"+PCid+"'");
        if(SQLFetch()==1)
        {
            //зашедший не новенький у него есть запись в таблице статов
            //пускай даже пустая
            PCRespect=StringToInt(SQLGetData(3));//респекты
            SetLocalString(OBJECT_SELF,"respect",IntToString(PCRespect));
            SQLExecDirect("SELECT * FROM pl_spec WHERE id='"+PCid+"'");
            while(SQLFetch()==1)
            {
                SetLocalString(OBJECT_SELF,SQLGetData(1),SQLGetData(2));
            }
            SetLocalString(OBJECT_SELF,"id",PCid);
            t4=GetPersistentString(oPC,"id","pl_spec");
            t5=GetPersistentString(oPC,"respect","pl_spec");
            SendMessageToPC(oPC,"Lid="+t4+", Lrespect="+t5);
            SendMessageToPC(oPC,"id="+PCid+", respect="+IntToString(PCRespect));
        }
        else
        {
            //зашедший новенький его надо экипировать и создать запись статов
            SQLExecDirect("INSERT INTO pl_stat VALUES('item',0,'',0,"+PCid+",'')");
            SQLExecDirect("INSERT INTO pl_spec VALUES("+PCid+",'','')");
            oAUS=CreateItemOnObject("ar_passport",oPC,1);
            SetLocalString(oAUS,"respect",IntToString(PCRespect));
        }
    }
    else BootPC(oPC);
  }
    t4=GetLocalString(oPC,"id");
    t5=GetLocalString(oPC,"respect");
    SendMessageToPC(oPC,"id="+t4+", respect="+t5);
}


тут много мусора для проверок...
_kaa_
QUOTE (Jurt @ Sep 26 2005, 06:14)
на OnClientEnter модуля висит следующая скриптина:

Neverwinter Script Source
SQLExecDirect("SELECT * FROM pl_data WHERE name='"+sName+"' AND pass= MD5('"+GetDeity(oPC)+"')");


Опасный код. sName надо проверять на вхождение символов `,' - смотря что ты используешь в ограничителях строк. Иначе игрок может создать хитрое имя, в котором есть такой символ, и выполнить SQL-запрос в твою базу. (такой вид уязвимости обычно называют SQL injection). Примеров приводить не буду, мало ли кто читает этот топик smile.gif

Далее,
Neverwinter Script Source
    SetLocalString(OBJECT_SELF,"respect",IntToString(PCRespect));

и
Neverwinter Script Source
    t5=GetLocalString(oPC,"respect");


В первом варианте OBJECT_SELF - объект-модуль, во втором oPC -игрок. Вешая переменную на модуль ты с игрока ее не прочитаешь.
Jurt
Спасибо большое!
Про хитрые имена помню и знаю, то что есть это пока только для "внутреннего пользования", а вот с OBJECT_SELF прокололся unsure.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2025 Invision Power Services, Inc.