Перейти к содержанию

[src] Запоминаем значение @autoloot


Рекомендуемые сообщения

[src] Запоминаем значение @autoloot

Хотелось бы дать пояснение для всех, кто начнёт разводить холивар, что мод не мой. Своё авторство доказывать даже не думаю, т.к. не смогу, мод писался несколько лет назад (3 года назад, если быть точным), но из-за смерти eA все мои моды на форуме были потёрты, но мод после оживления форума начал появляться в английской ветке форума без указания авторства (да и нужно ли оно? Пользуйтесь!).

Описание

Элементарное и изящное решение для запоминания значения указанного при использовании команды autoloot.

Установка

Править нужно два файла. Первым правим src/map/atcommand.с, находим функцию команды:

ACMD_FUNC(autoloot)

В конце функции после:

        clif_displaymessage(fd, msg_txt(1188)); // Autoloot is now off.

Добавляем:

    pc_setglobalreg(sd, add_str("char_autoloot"), sd->state.autoloot);

Теперь правим второй файл src/map/pc.с, находим:

void pc_reg_received(struct map_session_data *sd)
{
uint8 i;

sd->vars_ok = true;

Добавляем после:

    sd->state.autoloot = pc_readglobalreg(sd, add_str("char_autoloot"));

Всё, пользуемся на здоровье.

Принцип работы

Принцип работы очень прост, при использовании команды autoloot значение заносится в глобальные переменные персонажа (текстовый файл или база SQL — как у вас настроен сервер). Для этого используется переменная char_autoloot, впринципе, вы можете получить к ней доступ из ваших скриптов:

    mes "Значение команды @autoloot персонажа: ^3355FF"+char_autoloot+"^000000";

Практической пользы в скриптах в этом нет, но если интересно, то можно запрещать использование команды игрокам и создавать NPC с обработкой установки значения команды (но зачем?).

Изменено пользователем wl.illusion
  • Upvote 2
Ссылка на комментарий
Поделиться на другие сайты

  • 2 года спустя...

Много варнингов при компиляции на последней рАтене(

CC atcommand.c

atcommand.c: In function 'atcommand_autoloot':

atcommand.c:5934:3: warning: passing argument 2 of 'pc_setregistry' makes integer from pointer without a cast [enabled by default]

pc_setglobalreg(sd,"char_autoloot",sd->state.autoloot);

^

In file included from channel.h:7:0,

from atcommand.c:20:

pc.h:1053:5: note: expected 'int64' but argument is of type 'char *'

int pc_setregistry(struct map_session_data *sd, int64 reg, int val);

^

и

CC pc.c

pc.c: In function 'pc_reg_received':

pc.c:1341:2: warning: passing argument 2 of 'pc_readregistry' makes integer from pointer without a cast [enabled by default]

sd->state.autoloot = pc_readglobalreg(sd,"char_autoloot");

^

In file included from channel.h:7:0,

from pc.c:20:

pc.h:1052:5: note: expected 'int64' but argument is of type 'char *'

int pc_readregistry(struct map_session_data *sd, int64 reg);

^

Ссылка на комментарий
Поделиться на другие сайты

меняем:


pc_setglobalreg(sd,"char_autoloot",sd->state.autoloot);

на:


pc_setglobalreg(sd, add_str("char_autoloot"), sd->state.autoloot);

меняем:


sd->state.autoloot = pc_readglobalreg(sd,"char_autoloot");

на:


sd->state.autoloot = pc_readglobalreg(sd, add_str("char_autoloot"));

  • Upvote 2
Ссылка на комментарий
Поделиться на другие сайты

Есть проблема.... чара при заходе автоматически отключает от сервера... он загружается, но не видно ни НПЦ и не может ходить.

ВОт что с консоли сервера:

[Error]: pc_readregistry: Trying to read reg char_autoloot before it's been loaded!

[info]: Character 'Leprechaun' logged off.

Зато скомпилировалось без проблем)))

Походу он считывает при заходе какой % автолут выставлен, но так как он совсем не выставлен, даже не 0, он не может считать и дисконектит. Я думаю что как-то так)))

Изменено пользователем Leprechaun
Ссылка на комментарий
Поделиться на другие сайты

Да! Теперь все хорошо работает!

Думаю нужно обновить первый пост, выправить то, что


sd->state.autoloot = pc_readglobalreg(sd, add_str("char_autoloot"));

нужно вставлять после


void pc_reg_received(struct map_session_data *sd)
{
uint8 i;
sd->vars_ok = true;

Ссылка на комментарий
Поделиться на другие сайты

в функции pc_reg_received после:


sd->vars_ok = true;

Это с какой ревизии пошло? У меня такого нет, хотя я пару месяцев не обновлялся.

Ссылка на комментарий
Поделиться на другие сайты

Не могу сказать с какой пошло)) Если взять самую последнию...


sd->vars_ok = true;

такой код присутствует.

Последнюю я уже посмотрел, да там всё переделали, просто интересно с какой версии, чтобы понять зачем такие глобальные изменения.

Ссылка на комментарий
Поделиться на другие сайты

Это с какой ревизии пошло? У меня такого нет, хотя я пару месяцев не обновлялся.

11 июня 2015 года

Script Engine Upgrade

* Upgraded the script engine variables to no longer be limited.

* Increased array limit from 127 to 2 billion.

* Improvement in overall speed and storage size.

* All variable types now support arrays.

- Merge from HerculesWS/Hercules@82b583b. Thanks to those who worked on it.

https://github.com/r...3064e578e338c60

  • Upvote 1
Ссылка на комментарий
Поделиться на другие сайты

  • 6 месяцев спустя...

Давайте снова поднимем эту тему.

Я понимаю что Геркулес от рА несколько изменен, но что именно нужно изменить чтобы применить эту идею в Геркулесе?

Ссылка на комментарий
Поделиться на другие сайты

Если в atcommand.c прописать так: 

pc_setglobalreg (sd, script->add_str("char_autoloot"), sd->state.autoloot);

ерроров нету.

Проблема осталась с файлом pc.c, на код: 

sd->state.autoloot = pc_readglobalreg(sd, script->add_str("char_autoloot");
или на код:
sd->state.autoloot = pc_readglobalreg(sd,"char_autoloot");

 

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...
Яндекс.Метрика