mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-16 18:52:22 +00:00
Change eqstream interface to get rid of some stuff as well as flesh out a few more options plus some rule and performance changes
This commit is contained in:
+73
-66
@@ -9486,14 +9486,21 @@ void command_netstats(Client *c, const Seperator *sep)
|
||||
if (c->GetTarget() && c->GetTarget()->IsClient()) {
|
||||
client = c->GetTarget()->CastToClient();
|
||||
}
|
||||
|
||||
|
||||
if (strcasecmp(sep->arg[1], "reset") == 0) {
|
||||
auto connection = c->Connection();
|
||||
c->Message(0, "Resetting client stats (packet loss will not read correctly after reset).");
|
||||
connection->ResetStats();
|
||||
return;
|
||||
}
|
||||
|
||||
auto connection = c->Connection();
|
||||
auto &opts = connection->GetRawConnection()->GetManager()->GetOptions();
|
||||
auto &opts = connection->GetManager()->GetOptions();
|
||||
auto eqs_stats = connection->GetStats();
|
||||
auto &stats = eqs_stats.DaybreakStats;
|
||||
auto now = EQ::Net::Clock::now();
|
||||
auto sec_since_stats_reset = std::chrono::duration_cast<std::chrono::duration<double>>(now - stats.created).count();
|
||||
|
||||
|
||||
c->Message(0, "Netstats:");
|
||||
c->Message(0, "--------------------------------------------------------------------");
|
||||
c->Message(0, "Sent Bytes: %u (%.2f/sec)", stats.sent_bytes, stats.sent_bytes / sec_since_stats_reset);
|
||||
@@ -9516,29 +9523,31 @@ void command_netstats(Client *c, const Seperator *sep)
|
||||
c->Message(0, "Resent Fragments: %u (%.2f/sec)", stats.resent_fragments, stats.resent_fragments / sec_since_stats_reset);
|
||||
c->Message(0, "Resent Non-Fragments: %u (%.2f/sec)", stats.resent_full, stats.resent_full / sec_since_stats_reset);
|
||||
c->Message(0, "Dropped Datarate Packets: %u (%.2f/sec)", stats.dropped_datarate_packets, stats.dropped_datarate_packets / sec_since_stats_reset);
|
||||
|
||||
if (opts.outgoing_data_rate > 0.0) {
|
||||
c->Message(0, "Outgoing Link Saturation %.2f%% (%.2fkb/sec)", 100.0 * (1.0 - ((opts.outgoing_data_rate - stats.datarate_remaining) / opts.outgoing_data_rate)), opts.outgoing_data_rate);
|
||||
|
||||
if (opts.daybreak_options.outgoing_data_rate > 0.0) {
|
||||
c->Message(0, "Outgoing Link Saturation %.2f%% (%.2fkb/sec)", 100.0 * (1.0 - ((opts.daybreak_options.outgoing_data_rate - stats.datarate_remaining) / opts.daybreak_options.outgoing_data_rate)), opts.daybreak_options.outgoing_data_rate);
|
||||
}
|
||||
|
||||
if (opts.track_opcode_stats) {
|
||||
c->Message(0, "--------------------------------------------------------------------");
|
||||
c->Message(0, "Sent Packet Types");
|
||||
for (auto i = 0; i < _maxEmuOpcode; ++i) {
|
||||
auto cnt = eqs_stats.SentCount[i];
|
||||
if (cnt > 0) {
|
||||
c->Message(0, "%s: %u (%.2f / sec)", OpcodeNames[i], cnt, cnt / sec_since_stats_reset);
|
||||
}
|
||||
}
|
||||
|
||||
c->Message(0, "--------------------------------------------------------------------");
|
||||
c->Message(0, "Sent Packet Types");
|
||||
for (auto i = 0; i < _maxEmuOpcode; ++i) {
|
||||
auto cnt = eqs_stats.SentCount[i];
|
||||
if (cnt > 0) {
|
||||
c->Message(0, "%s: %u", OpcodeNames[i], cnt);
|
||||
c->Message(0, "--------------------------------------------------------------------");
|
||||
c->Message(0, "Recv Packet Types");
|
||||
for (auto i = 0; i < _maxEmuOpcode; ++i) {
|
||||
auto cnt = eqs_stats.RecvCount[i];
|
||||
if (cnt > 0) {
|
||||
c->Message(0, "%s: %u (%.2f / sec)", OpcodeNames[i], cnt, cnt / sec_since_stats_reset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
c->Message(0, "--------------------------------------------------------------------");
|
||||
c->Message(0, "Recv Packet Types");
|
||||
for (auto i = 0; i < _maxEmuOpcode; ++i) {
|
||||
auto cnt = eqs_stats.RecvCount[i];
|
||||
if (cnt > 0) {
|
||||
c->Message(0, "%s: %u", OpcodeNames[i], cnt);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
c->Message(0, "--------------------------------------------------------------------");
|
||||
}
|
||||
}
|
||||
@@ -12208,33 +12217,32 @@ void command_network(Client *c, const Seperator *sep)
|
||||
if (!strcasecmp(sep->arg[1], "getopt"))
|
||||
{
|
||||
auto eqsi = c->Connection();
|
||||
auto dbc = eqsi->GetRawConnection();
|
||||
auto manager = dbc->GetManager();
|
||||
auto manager = eqsi->GetManager();
|
||||
auto &opts = manager->GetOptions();
|
||||
|
||||
|
||||
if (!strcasecmp(sep->arg[2], "all"))
|
||||
{
|
||||
c->Message(0, "max_packet_size: %llu", opts.max_packet_size);
|
||||
c->Message(0, "max_connection_count: %llu", opts.max_connection_count);
|
||||
c->Message(0, "keepalive_delay_ms: %llu", opts.keepalive_delay_ms);
|
||||
c->Message(0, "resend_delay_factor: %.2f", opts.resend_delay_factor);
|
||||
c->Message(0, "resend_delay_ms: %llu", opts.resend_delay_ms);
|
||||
c->Message(0, "resend_delay_min: %llu", opts.resend_delay_min);
|
||||
c->Message(0, "resend_delay_max: %llu", opts.resend_delay_max);
|
||||
c->Message(0, "connect_delay_ms: %llu", opts.connect_delay_ms);
|
||||
c->Message(0, "connect_stale_ms: %llu", opts.connect_stale_ms);
|
||||
c->Message(0, "stale_connection_ms: %llu", opts.stale_connection_ms);
|
||||
c->Message(0, "crc_length: %llu", opts.crc_length);
|
||||
c->Message(0, "hold_size: %llu", opts.hold_size);
|
||||
c->Message(0, "hold_length_ms: %llu", opts.hold_length_ms);
|
||||
c->Message(0, "simulated_in_packet_loss: %llu", opts.simulated_in_packet_loss);
|
||||
c->Message(0, "simulated_out_packet_loss: %llu", opts.simulated_out_packet_loss);
|
||||
c->Message(0, "tic_rate_hertz: %.2f", opts.tic_rate_hertz);
|
||||
c->Message(0, "resend_timeout: %llu", opts.resend_timeout);
|
||||
c->Message(0, "connection_close_time: %llu", opts.connection_close_time);
|
||||
c->Message(0, "encode_passes[0]: %llu", opts.encode_passes[0]);
|
||||
c->Message(0, "encode_passes[1]: %llu", opts.encode_passes[1]);
|
||||
c->Message(0, "port: %llu", opts.port);
|
||||
c->Message(0, "max_packet_size: %llu", opts.daybreak_options.max_packet_size);
|
||||
c->Message(0, "max_connection_count: %llu", opts.daybreak_options.max_connection_count);
|
||||
c->Message(0, "keepalive_delay_ms: %llu", opts.daybreak_options.keepalive_delay_ms);
|
||||
c->Message(0, "resend_delay_factor: %.2f", opts.daybreak_options.resend_delay_factor);
|
||||
c->Message(0, "resend_delay_ms: %llu", opts.daybreak_options.resend_delay_ms);
|
||||
c->Message(0, "resend_delay_min: %llu", opts.daybreak_options.resend_delay_min);
|
||||
c->Message(0, "resend_delay_max: %llu", opts.daybreak_options.resend_delay_max);
|
||||
c->Message(0, "connect_delay_ms: %llu", opts.daybreak_options.connect_delay_ms);
|
||||
c->Message(0, "connect_stale_ms: %llu", opts.daybreak_options.connect_stale_ms);
|
||||
c->Message(0, "stale_connection_ms: %llu", opts.daybreak_options.stale_connection_ms);
|
||||
c->Message(0, "crc_length: %llu", opts.daybreak_options.crc_length);
|
||||
c->Message(0, "hold_size: %llu", opts.daybreak_options.hold_size);
|
||||
c->Message(0, "hold_length_ms: %llu", opts.daybreak_options.hold_length_ms);
|
||||
c->Message(0, "simulated_in_packet_loss: %llu", opts.daybreak_options.simulated_in_packet_loss);
|
||||
c->Message(0, "simulated_out_packet_loss: %llu", opts.daybreak_options.simulated_out_packet_loss);
|
||||
c->Message(0, "tic_rate_hertz: %.2f", opts.daybreak_options.tic_rate_hertz);
|
||||
c->Message(0, "resend_timeout: %llu", opts.daybreak_options.resend_timeout);
|
||||
c->Message(0, "connection_close_time: %llu", opts.daybreak_options.connection_close_time);
|
||||
c->Message(0, "encode_passes[0]: %llu", opts.daybreak_options.encode_passes[0]);
|
||||
c->Message(0, "encode_passes[1]: %llu", opts.daybreak_options.encode_passes[1]);
|
||||
c->Message(0, "port: %llu", opts.daybreak_options.port);
|
||||
}
|
||||
else {
|
||||
c->Message(0, "Unknown get option: %s", sep->arg[2]);
|
||||
@@ -12267,76 +12275,75 @@ void command_network(Client *c, const Seperator *sep)
|
||||
else if (!strcasecmp(sep->arg[1], "setopt"))
|
||||
{
|
||||
auto eqsi = c->Connection();
|
||||
auto dbc = eqsi->GetRawConnection();
|
||||
auto manager = dbc->GetManager();
|
||||
auto &opts = manager->GetOptions();
|
||||
|
||||
auto manager = eqsi->GetManager();
|
||||
auto &opts = manager->MutateOptions();
|
||||
|
||||
if (!strcasecmp(sep->arg[3], ""))
|
||||
{
|
||||
c->Message(0, "Missing value for set");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
std::string value = sep->arg[3];
|
||||
if (!strcasecmp(sep->arg[2], "max_connection_count"))
|
||||
{
|
||||
opts.max_connection_count = std::stoull(value);
|
||||
opts.daybreak_options.max_connection_count = std::stoull(value);
|
||||
}
|
||||
else if (!strcasecmp(sep->arg[2], "keepalive_delay_ms"))
|
||||
{
|
||||
opts.keepalive_delay_ms = std::stoull(value);
|
||||
opts.daybreak_options.keepalive_delay_ms = std::stoull(value);
|
||||
}
|
||||
else if (!strcasecmp(sep->arg[2], "resend_delay_factor"))
|
||||
{
|
||||
opts.resend_delay_factor = std::stod(value);
|
||||
opts.daybreak_options.resend_delay_factor = std::stod(value);
|
||||
}
|
||||
else if (!strcasecmp(sep->arg[2], "resend_delay_ms"))
|
||||
{
|
||||
opts.resend_delay_ms = std::stoull(value);
|
||||
opts.daybreak_options.resend_delay_ms = std::stoull(value);
|
||||
}
|
||||
else if (!strcasecmp(sep->arg[2], "resend_delay_min"))
|
||||
{
|
||||
opts.resend_delay_min = std::stoull(value);
|
||||
opts.daybreak_options.resend_delay_min = std::stoull(value);
|
||||
}
|
||||
else if (!strcasecmp(sep->arg[2], "resend_delay_max"))
|
||||
{
|
||||
opts.resend_delay_max = std::stoull(value);
|
||||
opts.daybreak_options.resend_delay_max = std::stoull(value);
|
||||
}
|
||||
else if (!strcasecmp(sep->arg[2], "connect_delay_ms"))
|
||||
{
|
||||
opts.connect_delay_ms = std::stoull(value);
|
||||
opts.daybreak_options.connect_delay_ms = std::stoull(value);
|
||||
}
|
||||
else if (!strcasecmp(sep->arg[2], "connect_stale_ms"))
|
||||
{
|
||||
opts.connect_stale_ms = std::stoull(value);
|
||||
opts.daybreak_options.connect_stale_ms = std::stoull(value);
|
||||
}
|
||||
else if (!strcasecmp(sep->arg[2], "stale_connection_ms"))
|
||||
{
|
||||
opts.stale_connection_ms = std::stoull(value);
|
||||
opts.daybreak_options.stale_connection_ms = std::stoull(value);
|
||||
}
|
||||
else if (!strcasecmp(sep->arg[2], "hold_size"))
|
||||
{
|
||||
opts.hold_size = std::stoull(value);
|
||||
opts.daybreak_options.hold_size = std::stoull(value);
|
||||
}
|
||||
else if (!strcasecmp(sep->arg[2], "hold_length_ms"))
|
||||
{
|
||||
opts.hold_length_ms = std::stoull(value);
|
||||
opts.daybreak_options.hold_length_ms = std::stoull(value);
|
||||
}
|
||||
else if (!strcasecmp(sep->arg[2], "simulated_in_packet_loss"))
|
||||
{
|
||||
opts.simulated_in_packet_loss = std::stoull(value);
|
||||
opts.daybreak_options.simulated_in_packet_loss = std::stoull(value);
|
||||
}
|
||||
else if (!strcasecmp(sep->arg[2], "simulated_out_packet_loss"))
|
||||
{
|
||||
opts.simulated_out_packet_loss = std::stoull(value);
|
||||
opts.daybreak_options.simulated_out_packet_loss = std::stoull(value);
|
||||
}
|
||||
else if (!strcasecmp(sep->arg[2], "resend_timeout"))
|
||||
{
|
||||
opts.resend_timeout = std::stoull(value);
|
||||
opts.daybreak_options.resend_timeout = std::stoull(value);
|
||||
}
|
||||
else if (!strcasecmp(sep->arg[2], "connection_close_time"))
|
||||
{
|
||||
opts.connection_close_time = std::stoull(value);
|
||||
opts.daybreak_options.connection_close_time = std::stoull(value);
|
||||
}
|
||||
else {
|
||||
c->Message(0, "Unknown set option: %s", sep->arg[2]);
|
||||
|
||||
@@ -671,24 +671,27 @@ void MobMovementManager::SendCommandToClients(Mob *m, float dx, float dy, float
|
||||
}
|
||||
}
|
||||
else {
|
||||
float short_range = RuleR(Pathing, ShortMovementUpdateRange);
|
||||
float long_range = zone->GetMaxMovementUpdateRange();
|
||||
|
||||
for (auto &c : _impl->Clients) {
|
||||
float dist = c->CalculateDistance(m->GetX(), m->GetY(), m->GetZ());
|
||||
|
||||
bool match = false;
|
||||
if (range & ClientRangeClose) {
|
||||
if (dist < 250.0f) {
|
||||
if (dist < short_range) {
|
||||
match = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!match && range & ClientRangeMedium) {
|
||||
if (dist >= 250.0f && dist < 1500.0f) {
|
||||
if (dist >= short_range && dist < long_range) {
|
||||
match = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!match && range & ClientRangeLong) {
|
||||
if (dist >= 1500.0f) {
|
||||
if (dist >= long_range) {
|
||||
match = true;
|
||||
}
|
||||
}
|
||||
|
||||
+3
-2
@@ -500,18 +500,19 @@ int main(int argc, char** argv) {
|
||||
if (!eqsf_open && Config->ZonePort != 0) {
|
||||
Log(Logs::General, Logs::Zone_Server, "Starting EQ Network server on port %d", Config->ZonePort);
|
||||
|
||||
EQ::Net::EQStreamManagerOptions opts(Config->ZonePort, false, true);
|
||||
EQStreamManagerInterfaceOptions opts(Config->ZonePort, false, true);
|
||||
opts.daybreak_options.resend_delay_ms = RuleI(Network, ResendDelayBaseMS);
|
||||
opts.daybreak_options.resend_delay_factor = RuleR(Network, ResendDelayFactor);
|
||||
opts.daybreak_options.resend_delay_min = RuleI(Network, ResendDelayMinMS);
|
||||
opts.daybreak_options.resend_delay_max = RuleI(Network, ResendDelayMaxMS);
|
||||
opts.daybreak_options.outgoing_data_rate = RuleR(Network, ClientDataRate);
|
||||
opts.track_opcode_stats = RuleB(Network, TrackOpcodeStats);
|
||||
eqsm.reset(new EQ::Net::EQStreamManager(opts));
|
||||
eqsf_open = true;
|
||||
|
||||
eqsm->OnNewConnection([&stream_identifier](std::shared_ptr<EQ::Net::EQStream> stream) {
|
||||
stream_identifier.AddStream(stream);
|
||||
LogF(Logs::Detail, Logs::World_Server, "New connection from IP {0}:{1}", stream->GetRawConnection()->RemoteEndpoint(), ntohs(stream->GetRemotePort()));
|
||||
LogF(Logs::Detail, Logs::World_Server, "New connection from IP {0}:{1}", stream->GetRemoteIP(), ntohs(stream->GetRemotePort()));
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ glm::mat4 CreateScaleMatrix(float sx, float sy, float sz) {
|
||||
return scale;
|
||||
}
|
||||
|
||||
OrientedBoundingBox::OrientedBoundingBox(glm::vec3 pos, glm::vec3 rot, glm::vec3 scale, glm::vec3 extents) {
|
||||
OrientedBoundingBox::OrientedBoundingBox(const glm::vec3 &pos, const glm::vec3 &rot, const glm::vec3 &scale, const glm::vec3 &extents) {
|
||||
min_x = -extents.x;
|
||||
max_x = extents.x;
|
||||
|
||||
@@ -81,7 +81,7 @@ OrientedBoundingBox::OrientedBoundingBox(glm::vec3 pos, glm::vec3 rot, glm::vec3
|
||||
inverted_transformation = glm::inverse(transformation);
|
||||
}
|
||||
|
||||
bool OrientedBoundingBox::ContainsPoint(glm::vec3 p) const {
|
||||
bool OrientedBoundingBox::ContainsPoint(const glm::vec3 &p) const {
|
||||
glm::vec4 pt(p.x, p.y, p.z, 1);
|
||||
glm::vec4 box_space_p = inverted_transformation * pt;
|
||||
|
||||
|
||||
@@ -8,10 +8,10 @@ class OrientedBoundingBox
|
||||
{
|
||||
public:
|
||||
OrientedBoundingBox() { }
|
||||
OrientedBoundingBox(glm::vec3 pos, glm::vec3 rot, glm::vec3 scale, glm::vec3 extents);
|
||||
OrientedBoundingBox(const glm::vec3 &pos, const glm::vec3 &rot, const glm::vec3 &scale, const glm::vec3 &extents);
|
||||
~OrientedBoundingBox() { }
|
||||
|
||||
bool ContainsPoint(glm::vec3 p) const;
|
||||
bool ContainsPoint(const glm::vec3 &p) const;
|
||||
|
||||
glm::mat4& GetTransformation() { return transformation; }
|
||||
glm::mat4& GetInvertedTransformation() { return inverted_transformation; }
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
extern Zone *zone;
|
||||
|
||||
const int MaxNavmeshNodes = 4096;
|
||||
const int MaxNavmeshNodes = 1024;
|
||||
|
||||
struct PathfinderNavmesh::Implementation
|
||||
{
|
||||
|
||||
@@ -30,7 +30,8 @@ bool WaterMapV2::InLava(const glm::vec3& location) const {
|
||||
}
|
||||
|
||||
bool WaterMapV2::InLiquid(const glm::vec3& location) const {
|
||||
return InWater(location) || InLava(location) || InVWater(location);
|
||||
auto rt = ReturnRegionType(location);
|
||||
return rt == RegionTypeWater || rt == RegionTypeVWater || rt == RegionTypeLava;
|
||||
}
|
||||
|
||||
bool WaterMapV2::InPvP(const glm::vec3& location) const {
|
||||
|
||||
+2
-2
@@ -1070,14 +1070,14 @@ bool Zone::LoadZoneCFG(const char* filename, uint16 instance_id)
|
||||
map_name = nullptr;
|
||||
|
||||
if(!database.GetZoneCFG(database.GetZoneID(filename), instance_id, &newzone_data, can_bind,
|
||||
can_combat, can_levitate, can_castoutdoor, is_city, is_hotzone, allow_mercs, zone_type, default_ruleset, &map_name))
|
||||
can_combat, can_levitate, can_castoutdoor, is_city, is_hotzone, allow_mercs, max_movement_update_range, zone_type, default_ruleset, &map_name))
|
||||
{
|
||||
// If loading a non-zero instance failed, try loading the default
|
||||
if (instance_id != 0)
|
||||
{
|
||||
safe_delete_array(map_name);
|
||||
if(!database.GetZoneCFG(database.GetZoneID(filename), 0, &newzone_data, can_bind, can_combat, can_levitate,
|
||||
can_castoutdoor, is_city, is_hotzone, allow_mercs, zone_type, default_ruleset, &map_name))
|
||||
can_castoutdoor, is_city, is_hotzone, allow_mercs, max_movement_update_range, zone_type, default_ruleset, &map_name))
|
||||
{
|
||||
Log(Logs::General, Logs::Error, "Error loading the Zone Config.");
|
||||
return false;
|
||||
|
||||
@@ -313,6 +313,8 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
double GetMaxMovementUpdateRange() const { return max_movement_update_range; }
|
||||
|
||||
/**
|
||||
* Modding hooks
|
||||
*/
|
||||
@@ -332,6 +334,7 @@ private:
|
||||
bool m_ucss_available;
|
||||
bool staticzone;
|
||||
bool zone_has_current_time;
|
||||
double max_movement_update_range;
|
||||
char *long_name;
|
||||
char *map_name;
|
||||
char *short_name;
|
||||
|
||||
+18
-3
@@ -80,7 +80,21 @@ bool ZoneDatabase::SaveZoneCFG(uint32 zoneid, uint16 instance_id, NewZone_Struct
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ZoneDatabase::GetZoneCFG(uint32 zoneid, uint16 instance_id, NewZone_Struct *zone_data, bool &can_bind, bool &can_combat, bool &can_levitate, bool &can_castoutdoor, bool &is_city, bool &is_hotzone, bool &allow_mercs, uint8 &zone_type, int &ruleset, char **map_filename) {
|
||||
bool ZoneDatabase::GetZoneCFG(
|
||||
uint32 zoneid,
|
||||
uint16 instance_id,
|
||||
NewZone_Struct *zone_data,
|
||||
bool &can_bind,
|
||||
bool &can_combat,
|
||||
bool &can_levitate,
|
||||
bool &can_castoutdoor,
|
||||
bool &is_city,
|
||||
bool &is_hotzone,
|
||||
bool &allow_mercs,
|
||||
double &max_movement_update_range,
|
||||
uint8 &zone_type,
|
||||
int &ruleset,
|
||||
char **map_filename) {
|
||||
|
||||
*map_filename = new char[100];
|
||||
zone_data->zone_id = zoneid;
|
||||
@@ -147,7 +161,8 @@ bool ZoneDatabase::GetZoneCFG(uint32 zoneid, uint16 instance_id, NewZone_Struct
|
||||
"fast_regen_hp, " // 57
|
||||
"fast_regen_mana, " // 58
|
||||
"fast_regen_endurance, " // 59
|
||||
"npc_max_aggro_dist " // 60
|
||||
"npc_max_aggro_dist, " // 60
|
||||
"max_movement_update_range " // 61
|
||||
"FROM zone WHERE zoneidnumber = %i AND version = %i",
|
||||
zoneid, instance_id);
|
||||
auto results = QueryDatabase(query);
|
||||
@@ -206,7 +221,7 @@ bool ZoneDatabase::GetZoneCFG(uint32 zoneid, uint16 instance_id, NewZone_Struct
|
||||
can_levitate = atoi(row[33]) == 0 ? false : true;
|
||||
can_castoutdoor = atoi(row[34]) == 0 ? false : true;
|
||||
is_hotzone = atoi(row[35]) == 0 ? false : true;
|
||||
|
||||
max_movement_update_range = atof(row[61]);
|
||||
|
||||
ruleset = atoi(row[36]);
|
||||
zone_data->SuspendBuffs = atoi(row[37]);
|
||||
|
||||
+15
-1
@@ -382,7 +382,21 @@ public:
|
||||
bool LoadAlternateAdvancement(Client *c);
|
||||
|
||||
/* Zone related */
|
||||
bool GetZoneCFG(uint32 zoneid, uint16 instance_id, NewZone_Struct *data, bool &can_bind, bool &can_combat, bool &can_levitate, bool &can_castoutdoor, bool &is_city, bool &is_hotzone, bool &allow_mercs, uint8 &zone_type, int &ruleset, char **map_filename);
|
||||
bool GetZoneCFG(
|
||||
uint32 zoneid,
|
||||
uint16 instance_id,
|
||||
NewZone_Struct *data,
|
||||
bool &can_bind,
|
||||
bool &can_combat,
|
||||
bool &can_levitate,
|
||||
bool &can_castoutdoor,
|
||||
bool &is_city,
|
||||
bool &is_hotzone,
|
||||
bool &allow_mercs,
|
||||
double &max_movement_update_range,
|
||||
uint8 &zone_type,
|
||||
int &ruleset,
|
||||
char **map_filename);
|
||||
bool SaveZoneCFG(uint32 zoneid, uint16 instance_id, NewZone_Struct* zd);
|
||||
bool LoadStaticZonePoints(LinkedList<ZonePoint*>* zone_point_list,const char* zonename, uint32 version);
|
||||
bool UpdateZoneSafeCoords(const char* zonename, const glm::vec3& location);
|
||||
|
||||
Reference in New Issue
Block a user