Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Наболевший вопрос, Вопрос не решенный...
Jurt
сообщение Sep 23 2005, 05:47
Сообщение #1


Level 1


Класс: Маг
Характер: Chaotic Evil
Раса: Человек



Помогите кто сталкивался с подобным:

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

А теперь вопрос:
Пишу SetLocalInt(oPC,"bla",1), а локальная переменная не плеере не устанавливается :unsure: как это побороть? Сделал пока через базу, но мне жалко игроков которым придется жить с лагами от постоянного обращения к базе.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
_kaa_
сообщение Sep 23 2005, 08:41
Сообщение #2


Level 9
Иконки Групп

Класс: Волшебник
Характер: Chaotic Good
Раса: Дракон
NWN: Скриптинг [PW]



Давай весь код, переменные на PC без проблем всегда вешались.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Jurt
сообщение Sep 26 2005, 05:14
Сообщение #3


Level 1


Класс: Маг
Характер: Chaotic Evil
Раса: Человек



на 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_
сообщение Sep 26 2005, 08:51
Сообщение #4


Level 9
Иконки Групп

Класс: Волшебник
Характер: Chaotic Good
Раса: Дракон
NWN: Скриптинг [PW]



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). Примеров приводить не буду, мало ли кто читает этот топик :)

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

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


В первом варианте OBJECT_SELF - объект-модуль, во втором oPC -игрок. Вешая переменную на модуль ты с игрока ее не прочитаешь.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Jurt
сообщение Sep 30 2005, 08:32
Сообщение #5


Level 1


Класс: Маг
Характер: Chaotic Evil
Раса: Человек



Спасибо большое!
Про хитрые имена помню и знаю, то что есть это пока только для "внутреннего пользования", а вот с OBJECT_SELF прокололся :unsure:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 25th May 2024 - 19:07