![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#1
|
|
Level 8 ![]() ![]() ![]() Класс: Фея Характер: Chaotic Evil Раса: Фея ![]() |
По ходу дела частенько приходится останавливать сервак, менять скрипты, добавлять чето, удалять... когда измененный модуль ставится на сервак и запускается - при заходе на серв все игроки оказываются в стартовой точке модуля. Всвязи с этим возникает вопрос - можно ли сделать так, чтобы игроки оставались на той же позиции, в которой дисконнектились и появлялись в той же позиции, несмотря на остановку сервака и изменение модуля? Я так понимаю, что это надо делать с помощью ДБ - сохранять местоположение игрока в скрипте OnClientLeave, но как именно - какими функциями зафиксировать местоположение игрока и как это в БД запихнуть ?
|
![]()
Сообщение
#2
|
|||||
Level 5 ![]() ![]() Класс: Некромант Характер: Neutral Evil Раса: Нежить NWN: Скриптинг [PW] ![]() |
По-моему, всё довольно просто:
и обратно:
Не проверял на практике, но вроде с синтаксисом всё нормально. P.S. Такие вопросы лучше задавать в форуме Neverwinter Nights Aurora Toolset имхо. |
||||
![]()
Сообщение
#3
|
|
Level 9 ![]() Класс: Волшебник Характер: Chaotic Good Раса: Дракон NWN: Скриптинг [PW] ![]() |
Все совсем не просто :(
Сохранять положение игрока на onClientLeave - не получится, координаты всегда будут нулевые (вроде я где-то в прикрепленном топике расписывал почему) Варианты решение: 1. Сохранять положение на OnEnter для любой локации. Локация будет та-же, но место нет 2. На onHeartBeat модуля поставить несложный скрипт, который будет перебирать всех игроков и запоминать в _локальной_ переменной вектор с месторасположением игрока. А на событие onClientLeave записывать месторасположение в базу. Только тут скрыта еще одна проблема :) Месторасположение храниться как Номер локации, коорд.X,Y,Z. Номер локации - число, которое _меняется_ после сборки модуля в тулсете при добавлении\удалинии локаций. Так что нужно использовать свои функции, вот тут есть вариант http://www.wrg.ru/forums/index.php?showtopic=241 |
![]()
Сообщение
#4
|
|
Level 8 ![]() ![]() ![]() Класс: Фея Характер: Chaotic Evil Раса: Фея ![]() |
Сенкс, буду разбираться
|
![]()
Сообщение
#5
|
|
Level 3 ![]() Класс: Тайный Лучник Характер: Neutral Good Раса: Эльф NWN: Скриптинг [PW] ![]() |
Можно использовать вместо SetCampaginLocation() 2 функции GetCampaignVector() и GetCampaignString(). С помощью первой храним собственно вектор, второй - тэг локации.
|
![]()
Сообщение
#6
|
|||
4-х Кубовый ![]() Класс: Некромант Характер: Lawful Evil Раса: Человек NWN: Скриптинг [Sn] Проклятие Левора ![]() |
Lazy Ranma
А зачем? Просто ради извращения? :unsure: |
||
![]()
Сообщение
#7
|
|
Level 3 ![]() Класс: Тайный Лучник Характер: Neutral Good Раса: Эльф NWN: Скриптинг [PW] ![]() |
Каа же написал, что SetCampaginLocation() пользоваться нельзя, ибо она неправильно локацию сохраняет. Поэтому сохранять вектор отдельно, а тэг отдельно - самое простое решение (я не говорю самое правильное).
Второй, более сложный вариант, - автоматически индексировать локации с базе данных. Тогда вместо тэга можно использовать ее индекс, а при изменении тэга локации нужно будет только отредактировать ее тэг в БД. Но это относится к MySQL базе. А вообще, советую забыть про стандартную базу данных. Она большая, медленная, ее нужно периодичекси паковать (а под линуксом этого, на сколько я знаю, до сих пор сделать нельзя), в ней куча глюков (с числами на конце, с SetLocation()), она жутко неудобная по сравнению с SQL. Именно из-за глюка с числами на конце (а это означало невозможность реализации массивов - про буковку на конце я не догадался) я в январе или феврале сего года в очередной раз помянул недобрым словом биовару и заменил весь код, использующий стандартную БД. Нужно ли говорить, что то, что я писал под стандартную БД несколько дней, с использованием SQL я написал за несколько часов, а кода в результате получилось в разы меньше? |
![]()
Сообщение
#8
|
|||
Level 9 ![]() Класс: Волшебник Характер: Chaotic Good Раса: Дракон NWN: Скриптинг [PW] ![]() |
Вся Ж. в том, что хранение Locaton - "правильное", а string хранится в мемо-полях и требует постоянной перепаковки баз данных. Я скорее соглашусь на внешний MySQL сервер :) Вариант без БД - добавить на каждую локацию через тулсет переменную с номером. Тот еще гемор, но работать будет быстро. |
||
![]()
Сообщение
#9
|
|
Level 1 Класс: Обыватель Характер: Lawful Good Раса: Человек ![]() |
Маленькая добавочка : onHeartBeat маленький интервал, выгоднее пользоваться такой конструкцией:
название скрипта "blabla" main() { DelayCommand(20.0,ExecuteScript("blabla",OBJECT_SELF)); } и вешать его на onClientEnter Может где-то ошибся но идея думаю ясна |
![]()
Сообщение
#10
|
|
Level 5 ![]() Класс: Страж Тьмы Характер: Chaotic Neutral Раса: Дракон NWN: Скриптинг [PW] ![]() |
Я в базе скриптов выложил систему, там есть, кстати, сохранение местонахождения. :)
Все работает. Что-то типо этого, только улучшенное стоит на моем шарде. |
![]() ![]() |
Текстовая версия | Сейчас: 26th April 2025 - 21:19 |