• Страница 1 из 1
  • 1
Архив - только для чтения
Модератор форума: andycrowz  
Табу на персонажа
TroyashkA
Скаут
Доброго времени суток.

Полазил по форуму, погуглил, но так и не нашел ответа на вопрос. Поэтому обращаюсь за помощью.

Проблема такова: необходимо на выбранного персонажа накладывать некоторое, так скажем, табу. Персонажа, имеющего это табу, можно убивать везде и всюду, без разницы, свои или чужие, также как не важна местность. Главное - это возможность убийства персонажа имеющего табу. Подскажите как реализовать это, дайте направление или, если есть, поделитесь готовым сорцом.

Спасибо за внимание, жду ответа.
Сообщение # 1 написано 05.03.2014 в 20:18
Evrial
Маршал
эээ брат.... эт довольно весёлый патч в ядро. по реализации:
1. в плеере флаг. типо если он есть - то твоё "табу" активно на плеере
2. Дальше в функции френдли/хостли лепим все проверки по этмоу вопросу.
3. Проверяем. выявляем баги. чиним их.
Сообщение # 2 написано 05.03.2014 в 21:53
TroyashkA
Скаут
Цитата Evrial ()
эээ брат.... эт довольно весёлый патч в ядро. по реализации:
1. в плеере флаг. типо если он есть - то твоё "табу" активно на плеере
2. Дальше в функции френдли/хостли лепим все проверки по этмоу вопросу.
3. Проверяем. выявляем баги. чиним их.


Сделал всё именно так. Но проблема не решается. А конкретно - я никак не могу сделать одного игрока враждебным, по отношению к остальным. Ковырял функции Unit::IsHostileTo() и Unit::IsFriendlyTo(), добавил проверку. Ну никак не получается - не враждебный и всё. Уже дошло до того, что нпц начал бить этого игрока с заданным флагом, а игроки - не могут.

Вот немного кода:
Код

Unit::IsFriendlyTo ...
pUnit->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK7))) return false;

Unit::IsHostileTo ...
pUnit->HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK7))) return true;


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

p.s. Конечно же имелось в виду, что фракция у игроков одна и та же.
Сообщение # 3 написано 07.03.2014 в 18:47
Evrial
Маршал
в player.h объявляем 2 строчки
Код
bool hasTabuFlag() const { return tabuFlag; }
void SetTabuFlag(bool on);

и перед приват частью:
Код
bool tabuFlag;


Дальше в Player.cpp:
в инициализацию плеера
Код
tabuFlag = false;

и функция:
Код
void Player::SetTabuFlag(bool on)
{
   if (on)
    tabuFlag= true;
   else
    tabuFlag= false;
}


И ТОЛЬКО ПОТОМ В ЮНИТЕ в функции френдли/хостли:
принцип проверки
Код
if (плеер_таргет->hasTabuFlag()) // именно таргет!!!
return true; // в случаи хостли, если же врендли - то false


Для установки этого флага собственно используется SetTabuFlag(true); где и как его использовать - дело твоё. пиши команду, делай в базу и делай проверку при загрузке... в общем простор для мысли.
Сообщение # 4 отредактировано Evrial - Пятница, 07.03.2014, 19:22
TroyashkA
Скаут
Да, спасибо за помощь, у меня флаг давался свой и с флагом нет проблемы, вся проблема в том, что если персы с одной фракции, то добавляй-не добавляй в Unit::IsHostileTo() и Unit::IsFriendlyTo(), все равно враждебности между игроками нет, вот в чем беда.

Добавлено (07.03.2014, 19:26)
---------------------------------------------
Может стоит, вместо того, чтобы задавать флаги и делать проверки в вышеназванных функциях, лучше давать какую-нибудь 100% враждебную фракцию на игрока, тем самым решив проблему? Это реально сделать?

p.s. так и сделал - выдал враждебную фракцию, получил что хотел. Тему можно закрывать. Спасибо за помощь!
Сообщение # 5 отредактировано TroyashkA - Пятница, 07.03.2014, 19:36
Dikse
А не проще ли было выдавать флаг игроку FFA_PVP что дает возможность убивать игрока как своим так и чужим но за исключением стоит запрет в столицах на бой.
У тебя плохое настроение? А ты попробуй без улыбки произнести: «Миша – мишенька, медведь! научи меня пердеть!»
>>Мой блог<<
Сообщение # 6 написано 08.03.2014 в 02:54
TroyashkA
Скаут
Цитата Dikse ()
А не проще ли было выдавать флаг игроку FFA_PVP что дает возможность убивать игрока как своим так и чужим но за исключением стоит запрет в столицах на бой.

Не проще. Так как начинал именно с выдачи этого флага, и тут много нюансов, с тем же запретом на бой, необходимостью запускать PvP-режим не только для жертвы и много чего еще.
Сообщение # 7 написано 08.03.2014 в 07:49
Evrial
Маршал
TroyashkA, хз как у тебя не получилось через функции, а через рассу получилось. ибо рассы учитываем именно функция френдли/хостли. Просто нужно было почти в самом начале сделать и не парится.
Сообщение # 8 написано 08.03.2014 в 14:42
Vicher
Admin
Цитата Evrial ()
TroyashkA, хз как у тебя не получилось через функции, а через рассу получилось. ибо рассы учитываем именно функция френдли/хостли. Просто нужно было почти в самом начале сделать и не парится.

Сервер лишь проверяет, может ли юнит бить другого юнита. За отображение возможности бить юнита (отображение как врага) в клиенте отвечает сам клиент. И что бы Вы не написали в isHostile/Friendly игрок "красным" не станет.
В данном случае единственный верный вариант - смена фракции.
Сообщение # 9 написано 09.03.2014 в 11:59
WoT_stre
Капрал
Идея супер!!! Ты ее реализовал?
Занимаюсь поднятием Бк
Сообщение # 10 написано 25.03.2014 в 05:30
BlackFlame
Старший Маршал
Цитата TroyashkA ()
так и сделал - выдал враждебную фракцию, получил что хотел. Тему можно закрывать. Спасибо за помощь!

Цитата WoT_stre ()
Идея супер!!! Ты ее реализовал?

[Вангую] Растопырь глаза свои сынок.
Сообщение # 11 написано 25.03.2014 в 08:36
Evrial
Маршал
Цитата Vicher ()
Сервер лишь проверяет, может ли юнит бить другого юнита. За отображение возможности бить юнита (отображение как врага) в клиенте отвечает сам клиент. И что бы Вы не написали в isHostile/Friendly игрок "красным" не станет.
В данном случае единственный верный вариант - смена фракции.

возможно ты и прав... наверно красный/зелёный определяется в клиенте в зависимости от фракции, а дальше уже обрабатывает ядро.
Сообщение # 12 написано 25.03.2014 в 20:13
  • Страница 1 из 1
  • 1
Поиск: