mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-13 02:11:30 +00:00
Implement PVP regions
This commit is contained in:
parent
d53d569020
commit
68df09a570
@ -44,6 +44,7 @@ extern volatile bool RunLoops;
|
||||
#include "zonedb.h"
|
||||
#include "petitions.h"
|
||||
#include "command.h"
|
||||
#include "water_map.h"
|
||||
#ifdef BOTS
|
||||
#include "bot_command.h"
|
||||
#endif
|
||||
@ -156,7 +157,8 @@ Client::Client(EQStreamInterface* ieqs)
|
||||
m_ZoneSummonLocation(-2.0f,-2.0f,-2.0f),
|
||||
m_AutoAttackPosition(0.0f, 0.0f, 0.0f, 0.0f),
|
||||
m_AutoAttackTargetLocation(0.0f, 0.0f, 0.0f),
|
||||
m_lastsave(-1)
|
||||
m_lastsave(-1),
|
||||
last_region_type(RegionTypeUnsupported)
|
||||
{
|
||||
for(int cf=0; cf < _FilterCount; cf++)
|
||||
ClientFilters[cf] = FilterShow;
|
||||
@ -2482,13 +2484,15 @@ uint16 Client::GetMaxSkillAfterSpecializationRules(EQEmu::skills::SkillType skil
|
||||
return Result;
|
||||
}
|
||||
|
||||
void Client::SetPVP(bool toggle) {
|
||||
void Client::SetPVP(bool toggle, bool message) {
|
||||
m_pp.pvp = toggle ? 1 : 0;
|
||||
|
||||
if(GetPVP())
|
||||
this->Message_StringID(MT_Shout,PVP_ON);
|
||||
else
|
||||
Message(13, "You no longer follow the ways of discord.");
|
||||
if (message) {
|
||||
if(GetPVP())
|
||||
this->Message_StringID(MT_Shout,PVP_ON);
|
||||
else
|
||||
Message(13, "You no longer follow the ways of discord.");
|
||||
}
|
||||
|
||||
SendAppearancePacket(AT_PVP, GetPVP());
|
||||
Save();
|
||||
@ -8533,3 +8537,27 @@ uint32 Client::GetMoney(uint8 type, uint8 subtype) {
|
||||
int Client::GetAccountAge() {
|
||||
return (time(nullptr) - GetAccountCreation());
|
||||
}
|
||||
|
||||
void Client::CheckRegionTypeChanges()
|
||||
{
|
||||
if (!zone->HasWaterMap())
|
||||
return;
|
||||
|
||||
auto new_region = zone->watermap->ReturnRegionType(glm::vec3(m_Position));
|
||||
|
||||
// still same region, do nothing
|
||||
if (last_region_type == new_region)
|
||||
return;
|
||||
|
||||
// region type changed
|
||||
last_region_type = new_region;
|
||||
|
||||
// PVP is the only state we need to keep track of, so we can just return now for PVP servers
|
||||
if (RuleI(World, PVPSettings) > 0)
|
||||
return;
|
||||
|
||||
if (last_region_type == RegionTypePVP)
|
||||
SetPVP(true, false);
|
||||
else if (GetPVP())
|
||||
SetPVP(false, false);
|
||||
}
|
||||
|
||||
@ -27,6 +27,7 @@ class Object;
|
||||
class Raid;
|
||||
class Seperator;
|
||||
class ServerPacket;
|
||||
enum WaterRegionType : int;
|
||||
|
||||
namespace EQEmu
|
||||
{
|
||||
@ -360,9 +361,9 @@ public:
|
||||
int32 LevelRegen();
|
||||
void HPTick();
|
||||
void SetGM(bool toggle);
|
||||
void SetPVP(bool toggle);
|
||||
void SetPVP(bool toggle, bool message = true);
|
||||
|
||||
inline bool GetPVP() const { return zone->GetZoneID() == 77 ? true : (m_pp.pvp != 0); }
|
||||
inline bool GetPVP() const { return m_pp.pvp != 0; }
|
||||
inline bool GetGM() const { return m_pp.gm != 0; }
|
||||
|
||||
inline void SetBaseClass(uint32 i) { m_pp.class_=i; }
|
||||
@ -1233,6 +1234,8 @@ public:
|
||||
|
||||
void SendHPUpdateMarquee();
|
||||
|
||||
void CheckRegionTypeChanges();
|
||||
|
||||
protected:
|
||||
friend class Mob;
|
||||
void CalcItemBonuses(StatBonuses* newbon);
|
||||
@ -1417,6 +1420,7 @@ private:
|
||||
uint8 zonesummon_ignorerestrictions;
|
||||
ZoneMode zone_mode;
|
||||
|
||||
WaterRegionType last_region_type;
|
||||
|
||||
Timer position_timer;
|
||||
uint8 position_timer_counter;
|
||||
|
||||
@ -4576,8 +4576,11 @@ void Client::Handle_OP_ClientUpdate(const EQApplicationPacket *app)
|
||||
safe_delete(outapp);
|
||||
}
|
||||
|
||||
if(zone->watermap && zone->watermap->InLiquid(glm::vec3(m_Position)))
|
||||
CheckIncreaseSkill(EQEmu::skills::SkillSwimming, nullptr, -17);
|
||||
if (zone->watermap) {
|
||||
if (zone->watermap->InLiquid(glm::vec3(m_Position)))
|
||||
CheckIncreaseSkill(EQEmu::skills::SkillSwimming, nullptr, -17);
|
||||
CheckRegionTypeChanges();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
|
||||
extern const ZoneConfig *Config;
|
||||
|
||||
enum WaterRegionType {
|
||||
enum WaterRegionType : int {
|
||||
RegionTypeUnsupported = -2,
|
||||
RegionTypeUntagged = -1,
|
||||
RegionTypeNormal = 0,
|
||||
@ -33,6 +33,7 @@ public:
|
||||
virtual bool InVWater(const glm::vec3& location) const = 0;
|
||||
virtual bool InLava(const glm::vec3& location) const = 0;
|
||||
virtual bool InLiquid(const glm::vec3& location) const = 0;
|
||||
virtual bool InPvP(const glm::vec3& location) const = 0;
|
||||
|
||||
protected:
|
||||
virtual bool Load(FILE *fp) { return false; }
|
||||
|
||||
@ -30,6 +30,10 @@ bool WaterMapV1::InLiquid(const glm::vec3& location) const {
|
||||
return InWater(location) || InLava(location);
|
||||
}
|
||||
|
||||
bool WaterMapV1::InPvP(const glm::vec3& location) const {
|
||||
return ReturnRegionType(location) == RegionTypePVP;
|
||||
}
|
||||
|
||||
bool WaterMapV1::Load(FILE *fp) {
|
||||
uint32 bsp_tree_size;
|
||||
if (fread(&bsp_tree_size, sizeof(bsp_tree_size), 1, fp) != 1) {
|
||||
|
||||
@ -24,6 +24,7 @@ public:
|
||||
virtual bool InVWater(const glm::vec3& location) const;
|
||||
virtual bool InLava(const glm::vec3& location) const;
|
||||
virtual bool InLiquid(const glm::vec3& location) const;
|
||||
virtual bool InPvP(const glm::vec3& location) const;
|
||||
|
||||
protected:
|
||||
virtual bool Load(FILE *fp);
|
||||
|
||||
@ -33,6 +33,10 @@ bool WaterMapV2::InLiquid(const glm::vec3& location) const {
|
||||
return InWater(location) || InLava(location);
|
||||
}
|
||||
|
||||
bool WaterMapV2::InPvP(const glm::vec3& location) const {
|
||||
return ReturnRegionType(location) == RegionTypePVP;
|
||||
}
|
||||
|
||||
bool WaterMapV2::Load(FILE *fp) {
|
||||
uint32 region_count;
|
||||
if (fread(®ion_count, sizeof(region_count), 1, fp) != 1) {
|
||||
|
||||
@ -17,6 +17,7 @@ public:
|
||||
virtual bool InVWater(const glm::vec3& location) const;
|
||||
virtual bool InLava(const glm::vec3& location) const;
|
||||
virtual bool InLiquid(const glm::vec3& location) const;
|
||||
virtual bool InPvP(const glm::vec3& location) const;
|
||||
|
||||
protected:
|
||||
virtual bool Load(FILE *fp);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user