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

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

 
Ответить в эту темуОткрыть новую тему
> Сохранение местоположения игрока, Как сохранить положение игрока ?
Raven
сообщение Oct 18 2004, 20:02
Сообщение #1


Level 8
***

Класс: Фея
Характер: Chaotic Evil
Раса: Фея



По ходу дела частенько приходится останавливать сервак, менять скрипты, добавлять чето, удалять... когда измененный модуль ставится на сервак и запускается - при заходе на серв все игроки оказываются в стартовой точке модуля. Всвязи с этим возникает вопрос - можно ли сделать так, чтобы игроки оставались на той же позиции, в которой дисконнектились и появлялись в той же позиции, несмотря на остановку сервака и изменение модуля? Я так понимаю, что это надо делать с помощью ДБ - сохранять местоположение игрока в скрипте OnClientLeave, но как именно - какими функциями зафиксировать местоположение игрока и как это в БД запихнуть ?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Twin
сообщение Oct 19 2004, 06:20
Сообщение #2


Level 5
**

Класс: Некромант
Характер: Neutral Evil
Раса: Нежить
NWN: Скриптинг [PW]



По-моему, всё довольно просто:
Neverwinter Script Source
object oPC = <игрок>
SetCampaignLocation("PW Database", "StartLocation", GetLocation(oPC), oPC);

и обратно:
Neverwinter Script Source
object oPC = <игрок>
AssignCommand(oPC,
  JumpToLocation(GetCampaignLocation("PW Database", "StartLocation", oPC))
)


Не проверял на практике, но вроде с синтаксисом всё нормально.

P.S. Такие вопросы лучше задавать в форуме Neverwinter Nights Aurora Toolset имхо.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
_kaa_
сообщение Oct 19 2004, 22:01
Сообщение #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
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Raven
сообщение Oct 19 2004, 22:39
Сообщение #4


Level 8
***

Класс: Фея
Характер: Chaotic Evil
Раса: Фея



Сенкс, буду разбираться
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lazy Ranma
сообщение Oct 24 2004, 00:36
Сообщение #5


Level 3
*

Класс: Тайный Лучник
Характер: Neutral Good
Раса: Эльф
NWN: Скриптинг [PW]



Можно использовать вместо SetCampaginLocation() 2 функции GetCampaignVector() и GetCampaignString(). С помощью первой храним собственно вектор, второй - тэг локации.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
DBColl
сообщение Oct 24 2004, 02:22
Сообщение #6


4-х Кубовый
Иконки Групп

Класс: Некромант
Характер: Lawful Evil
Раса: Человек
NWN: Скриптинг [Sn]
Проклятие Левора



Lazy Ranma
QUOTE (Lazy Ranma @ Oct 24 2004, 00:36)
Можно использовать вместо SetCampaginLocation() 2 функции GetCampaignVector() и GetCampaignString(). С помощью первой храним собственно вектор, второй - тэг локации.

А зачем? Просто ради извращения? :unsure:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lazy Ranma
сообщение Oct 24 2004, 12:06
Сообщение #7


Level 3
*

Класс: Тайный Лучник
Характер: Neutral Good
Раса: Эльф
NWN: Скриптинг [PW]



Каа же написал, что SetCampaginLocation() пользоваться нельзя, ибо она неправильно локацию сохраняет. Поэтому сохранять вектор отдельно, а тэг отдельно - самое простое решение (я не говорю самое правильное).

Второй, более сложный вариант, - автоматически индексировать локации с базе данных. Тогда вместо тэга можно использовать ее индекс, а при изменении тэга локации нужно будет только отредактировать ее тэг в БД. Но это относится к MySQL базе.

А вообще, советую забыть про стандартную базу данных. Она большая, медленная, ее нужно периодичекси паковать (а под линуксом этого, на сколько я знаю, до сих пор сделать нельзя), в ней куча глюков (с числами на конце, с SetLocation()), она жутко неудобная по сравнению с SQL. Именно из-за глюка с числами на конце (а это означало невозможность реализации массивов - про буковку на конце я не догадался) я в январе или феврале сего года в очередной раз помянул недобрым словом биовару и заменил весь код, использующий стандартную БД. Нужно ли говорить, что то, что я писал под стандартную БД несколько дней, с использованием SQL я написал за несколько часов, а кода в результате получилось в разы меньше?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
_kaa_
сообщение Oct 25 2004, 12:34
Сообщение #8


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

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



QUOTE (Lazy Ranma @ Oct 24 2004, 00:36)
Можно использовать вместо SetCampaginLocation() 2 функции GetCampaignVector() и GetCampaignString(). С помощью первой храним собственно вектор, второй - тэг локации.

Вся Ж. в том, что хранение Locaton - "правильное", а string хранится в мемо-полях и требует постоянной перепаковки баз данных. Я скорее соглашусь на внешний MySQL сервер :)

Вариант без БД - добавить на каждую локацию через тулсет переменную с номером. Тот еще гемор, но работать будет быстро.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
exxeLL
сообщение Apr 30 2005, 02:56
Сообщение #9


Level 1


Класс: Обыватель
Характер: Lawful Good
Раса: Человек



Маленькая добавочка : onHeartBeat маленький интервал, выгоднее пользоваться такой конструкцией:
название скрипта "blabla"
main()
{
DelayCommand(20.0,ExecuteScript("blabla",OBJECT_SELF));
}
и вешать его на onClientEnter
Может где-то ошибся но идея думаю ясна
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
RiPPeR
сообщение Apr 30 2005, 07:34
Сообщение #10


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

Класс: Страж Тьмы
Характер: Chaotic Neutral
Раса: Дракон
NWN: Скриптинг [PW]



Я в базе скриптов выложил систему, там есть, кстати, сохранение местонахождения. :)
Все работает. Что-то типо этого, только улучшенное стоит на моем шарде.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

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

 



Текстовая версия Сейчас: 29th March 2024 - 00:22