mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-31 13:16:39 +00:00
Compare commits
10 Commits
v23.3.1
...
base_resists
| Author | SHA1 | Date | |
|---|---|---|---|
| b894d7ee3a | |||
| eecfce6514 | |||
| 2d6950149a | |||
| 3945a8c0c0 | |||
| f27209a812 | |||
| d4982743bf | |||
| e2dd8f5f60 | |||
| bfc0cceecc | |||
| c9902881b7 | |||
| 62bb426847 |
@@ -514,6 +514,12 @@ bool Database::SaveCharacterCreate(uint32 character_id, uint32 account_id, Playe
|
||||
c.raid_auto_consent = pp->raidAutoconsent;
|
||||
c.guild_auto_consent = pp->guildAutoconsent;
|
||||
c.RestTimer = pp->RestTimer;
|
||||
c.cold_resist = pp->cold_resist;
|
||||
c.fire_resist = pp->fire_resist;
|
||||
c.magic_resist = pp->magic_resist;
|
||||
c.disease_resist = pp->disease_resist;
|
||||
c.poison_resist = pp->poison_resist;
|
||||
c.corruption_resist = pp->corruption_resist;
|
||||
|
||||
CharacterDataRepository::ReplaceOne(*this, c);
|
||||
|
||||
|
||||
@@ -1121,6 +1121,12 @@ struct PlayerProfile_Struct
|
||||
/*19559*/ uint8 unknown19595[5]; // ***Placeholder (6/29/2005)
|
||||
/*19564*/ uint32 RestTimer;
|
||||
/*19568*/ uint32 char_id; // Found as part of bazaar revamp (5/15/2024)
|
||||
/*19572*/ uint32 cold_resist;
|
||||
/*19576*/ uint32 fire_resist;
|
||||
/*19580*/ uint32 magic_resist;
|
||||
/*19584*/ uint32 disease_resist;
|
||||
/*19588*/ uint32 poison_resist;
|
||||
/*19592*/ uint32 corruption_resist;
|
||||
|
||||
// All player profile packets are translated and this overhead is ignored in out-bound packets
|
||||
PlayerProfile_Struct() : m_player_profile_version(EQ::versions::MobVersion::Unknown) { }
|
||||
|
||||
@@ -2288,13 +2288,13 @@ namespace RoF
|
||||
outapp->WriteSInt32(345); // Mana Total ?
|
||||
|
||||
// these are needed to fix display bugs
|
||||
outapp->WriteUInt32(0x19); // base CR
|
||||
outapp->WriteUInt32(0x19); // base FR
|
||||
outapp->WriteUInt32(0x19); // base MR
|
||||
outapp->WriteUInt32(0xf); // base DR
|
||||
outapp->WriteUInt32(0xf); // base PR
|
||||
outapp->WriteUInt32(emu->cold_resist); // base CR
|
||||
outapp->WriteUInt32(emu->fire_resist); // base FR
|
||||
outapp->WriteUInt32(emu->magic_resist); // base MR
|
||||
outapp->WriteUInt32(emu->disease_resist); // base DR
|
||||
outapp->WriteUInt32(emu->poison_resist); // base PR
|
||||
outapp->WriteUInt32(0xf); // base PhR?
|
||||
outapp->WriteUInt32(0xf); // base Corrup
|
||||
outapp->WriteUInt32(emu->corruption_resist); // base Corrup
|
||||
outapp->WriteUInt32(0); // Unknown
|
||||
outapp->WriteUInt32(0); // Unknown
|
||||
outapp->WriteUInt32(0); // Unknown
|
||||
|
||||
@@ -2806,13 +2806,13 @@ namespace RoF2
|
||||
outapp->WriteSInt32(345); // Mana Total ?
|
||||
|
||||
// these are needed to fix display bugs
|
||||
outapp->WriteUInt32(0x19); // base CR
|
||||
outapp->WriteUInt32(0x19); // base FR
|
||||
outapp->WriteUInt32(0x19); // base MR
|
||||
outapp->WriteUInt32(0xf); // base DR
|
||||
outapp->WriteUInt32(0xf); // base PR
|
||||
outapp->WriteUInt32(emu->cold_resist); // base CR
|
||||
outapp->WriteUInt32(emu->fire_resist); // base FR
|
||||
outapp->WriteUInt32(emu->magic_resist); // base MR
|
||||
outapp->WriteUInt32(emu->disease_resist); // base DR
|
||||
outapp->WriteUInt32(emu->poison_resist); // base PR
|
||||
outapp->WriteUInt32(0xf); // base PhR?
|
||||
outapp->WriteUInt32(0xf); // base Corrup
|
||||
outapp->WriteUInt32(emu->corruption_resist); // base Corrup
|
||||
outapp->WriteUInt32(0); // Unknown
|
||||
outapp->WriteUInt32(0); // Unknown
|
||||
outapp->WriteUInt32(0); // Unknown
|
||||
|
||||
+19
-7
@@ -1669,15 +1669,27 @@ namespace SoD
|
||||
// OUT(unknown19584[4]);
|
||||
// OUT(unknown19588);
|
||||
|
||||
const uint8 bytes[] = {
|
||||
0xa3, 0x02, 0x00, 0x00, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
|
||||
0x19, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00,
|
||||
0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0x85, 0xEB, 0x3E, 0x33, 0x33, 0x33, 0x3F,
|
||||
0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
const uint8 unknown12864_bytes[] = {
|
||||
0xa3, 0x02, 0x00, 0x00, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
memcpy(eq->unknown12864, bytes, sizeof(bytes));
|
||||
memcpy(eq->unknown12864, unknown12864_bytes, sizeof(unknown12864_bytes));
|
||||
|
||||
eq->cold_resist = emu->cold_resist;
|
||||
eq->fire_resist = emu->fire_resist;
|
||||
eq->magic_resist = emu->magic_resist;
|
||||
eq->disease_resist = emu->disease_resist;
|
||||
eq->poison_resist = emu->poison_resist;
|
||||
eq->physical_resist = 15;
|
||||
eq->corruption_resist = emu->corruption_resist;
|
||||
|
||||
const uint8 unknown15112_bytes[] = {
|
||||
0x1F, 0x85, 0xEB, 0x3E, 0x33, 0x33, 0x33, 0x3F, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
memcpy(eq->unknown15112, unknown15112_bytes, sizeof(unknown15112_bytes));
|
||||
|
||||
//set the checksum...
|
||||
CRC32::SetEQChecksum(__packet->pBuffer, sizeof(structs::PlayerProfile_Struct) - 4);
|
||||
|
||||
@@ -944,7 +944,15 @@ struct PlayerProfile_Struct
|
||||
/*14700*/ PotionBelt_Struct potionbelt; // [360] potion belt 72 extra octets by adding 1 more belt slot
|
||||
/*15060*/ uint8 unknown12852[8];
|
||||
/*15068*/ uint32 available_slots;
|
||||
/*15072*/ uint8 unknown12864[80]; //#### uint8 uint8 unknown12864[76]; in Titanium ####[80]
|
||||
/*15072*/ uint8 unknown12864[12]; //#### uint8 uint8 unknown12864[76]; in Titanium ####[80]
|
||||
/*15084*/ uint32 cold_resist;
|
||||
/*15088*/ uint32 fire_resist;
|
||||
/*15092*/ uint32 magic_resist;
|
||||
/*15096*/ uint32 disease_resist;
|
||||
/*15100*/ uint32 poison_resist;
|
||||
/*15104*/ uint32 physical_resist;
|
||||
/*15108*/ uint32 corruption_resist;
|
||||
/*15112*/ uint8 unknown15112[40];
|
||||
//END SUB-STRUCT used for shrouding.
|
||||
/*15152*/ char name[64]; // Name of player
|
||||
/*15216*/ char last_name[32]; // Last name of player
|
||||
|
||||
+19
-7
@@ -1339,15 +1339,27 @@ namespace SoF
|
||||
// OUT(unknown19584[4]);
|
||||
// OUT(unknown19588);
|
||||
|
||||
const uint8 bytes[] = {
|
||||
0xa3, 0x02, 0x00, 0x00, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
|
||||
0x19, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00,
|
||||
0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0x85, 0xEB, 0x3E, 0x33, 0x33, 0x33, 0x3F,
|
||||
0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
const uint8 unknown12864_bytes[] = {
|
||||
0xa3, 0x02, 0x00, 0x00, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
memcpy(eq->unknown12864, bytes, sizeof(bytes));
|
||||
memcpy(eq->unknown12864, unknown12864_bytes, sizeof(unknown12864_bytes));
|
||||
|
||||
eq->cold_resist = emu->cold_resist;
|
||||
eq->fire_resist = emu->fire_resist;
|
||||
eq->magic_resist = emu->magic_resist;
|
||||
eq->disease_resist = emu->disease_resist;
|
||||
eq->poison_resist = emu->poison_resist;
|
||||
eq->physical_resist = 15;
|
||||
eq->corruption_resist = emu->corruption_resist;
|
||||
|
||||
const uint8 unknown15112_bytes[] = {
|
||||
0x1F, 0x85, 0xEB, 0x3E, 0x33, 0x33, 0x33, 0x3F, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
|
||||
0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
memcpy(eq->unknown15112, unknown15112_bytes, sizeof(unknown15112_bytes));
|
||||
|
||||
//set the checksum...
|
||||
CRC32::SetEQChecksum(__packet->pBuffer, sizeof(structs::PlayerProfile_Struct) - 4);
|
||||
|
||||
@@ -944,7 +944,16 @@ struct PlayerProfile_Struct //23576 Octets
|
||||
/*14700*/ PotionBelt_Struct potionbelt; // [360] potion belt 72 extra octets by adding 1 more belt slot
|
||||
/*15060*/ uint8 unknown12852[8];
|
||||
/*15068*/ uint32 available_slots;
|
||||
/*15072*/ uint8 unknown12864[80]; //#### uint8 uint8 unknown12864[76]; in Titanium ####[80]
|
||||
/*15072*/ uint8 unknown12864[12]; //#### uint8 uint8 unknown12864[76]; in Titanium ####[80]
|
||||
/*15084*/ uint32 cold_resist;
|
||||
/*15088*/ uint32 fire_resist;
|
||||
/*15092*/ uint32 magic_resist;
|
||||
/*15096*/ uint32 disease_resist;
|
||||
/*15100*/ uint32 poison_resist;
|
||||
/*15104*/ uint32 physical_resist;
|
||||
/*15108*/ uint32 corruption_resist;
|
||||
/*15112*/ uint8 unknown15112[40];
|
||||
|
||||
//END SUB-STRUCT used for shrouding.
|
||||
/*15120*/ char name[64]; // Name of player
|
||||
/*15184*/ char last_name[32]; // Last name of player
|
||||
|
||||
@@ -1600,14 +1600,25 @@ namespace Titanium
|
||||
// OUT(unknown19584[4]);
|
||||
// OUT(unknown19588);
|
||||
|
||||
const uint8 unknown12864_bytes[] = {
|
||||
0x78, 0x03, 0x00, 0x00, 0x1A, 0x04, 0x00, 0x00, 0x1A, 0x04, 0x00, 0x00
|
||||
};
|
||||
|
||||
const uint8 bytes[] = {
|
||||
0x78, 0x03, 0x00, 0x00, 0x1A, 0x04, 0x00, 0x00, 0x1A, 0x04, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
|
||||
0x19, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00,
|
||||
0x0F, 0x00, 0x00, 0x00, 0x1F, 0x85, 0xEB, 0x3E, 0x33, 0x33, 0x33, 0x3F, 0x09, 0x00, 0x00, 0x00,
|
||||
memcpy(eq->unknown12864, unknown12864_bytes, sizeof(unknown12864_bytes));
|
||||
|
||||
eq->cold_resist = emu->cold_resist;
|
||||
eq->fire_resist = emu->fire_resist;
|
||||
eq->magic_resist = emu->magic_resist;
|
||||
eq->disease_resist = emu->disease_resist;
|
||||
eq->poison_resist = emu->poison_resist;
|
||||
eq->physical_resist = 15;
|
||||
|
||||
const uint8 unknown12900_bytes[] = {
|
||||
0x1F, 0x85, 0xEB, 0x3E, 0x33, 0x33, 0x33, 0x3F, 0x09, 0x00, 0x00, 0x00,
|
||||
0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14
|
||||
};
|
||||
memcpy(eq->unknown12864, bytes, sizeof(bytes));
|
||||
|
||||
memcpy(eq->unknown12900, unknown12900_bytes, sizeof(unknown12900_bytes));
|
||||
|
||||
//set the checksum...
|
||||
CRC32::SetEQChecksum(__packet->pBuffer, sizeof(structs::PlayerProfile_Struct) - 4);
|
||||
|
||||
@@ -879,7 +879,14 @@ struct PlayerProfile_Struct
|
||||
/*12564*/ PotionBelt_Struct potionbelt; // potion belt
|
||||
/*12852*/ uint8 unknown12852[8];
|
||||
/*12860*/ uint32 available_slots;
|
||||
/*12864*/ uint8 unknown12864[76];
|
||||
/*12864*/ uint8 unknown12864[12];
|
||||
/*12876*/ uint32 cold_resist;
|
||||
/*12880*/ uint32 fire_resist;
|
||||
/*12884*/ uint32 magic_resist;
|
||||
/*12888*/ uint32 disease_resist;
|
||||
/*12892*/ uint32 poison_resist;
|
||||
/*12896*/ uint32 physical_resist;
|
||||
/*12900*/ uint8 unknown12900[40];
|
||||
/*12940*/ char name[64]; // Name of player
|
||||
/*13004*/ char last_name[32]; // Last name of player
|
||||
/*13036*/ uint32 guild_id; // guildid
|
||||
|
||||
@@ -34,6 +34,12 @@ public:
|
||||
uint32_t alloc_int;
|
||||
uint32_t alloc_wis;
|
||||
uint32_t alloc_cha;
|
||||
uint32_t base_cr;
|
||||
uint32_t base_fr;
|
||||
uint32_t base_mr;
|
||||
uint32_t base_dr;
|
||||
uint32_t base_pr;
|
||||
uint32_t base_corrup;
|
||||
};
|
||||
|
||||
static std::string PrimaryKey()
|
||||
@@ -59,6 +65,12 @@ public:
|
||||
"alloc_int",
|
||||
"alloc_wis",
|
||||
"alloc_cha",
|
||||
"base_cr",
|
||||
"base_fr",
|
||||
"base_mr",
|
||||
"base_dr",
|
||||
"base_pr",
|
||||
"base_corrup",
|
||||
};
|
||||
}
|
||||
|
||||
@@ -80,6 +92,12 @@ public:
|
||||
"alloc_int",
|
||||
"alloc_wis",
|
||||
"alloc_cha",
|
||||
"base_cr",
|
||||
"base_fr",
|
||||
"base_mr",
|
||||
"base_dr",
|
||||
"base_pr",
|
||||
"base_corrup",
|
||||
};
|
||||
}
|
||||
|
||||
@@ -135,6 +153,12 @@ public:
|
||||
e.alloc_int = 0;
|
||||
e.alloc_wis = 0;
|
||||
e.alloc_cha = 0;
|
||||
e.base_cr = 0;
|
||||
e.base_fr = 0;
|
||||
e.base_mr = 0;
|
||||
e.base_dr = 0;
|
||||
e.base_pr = 0;
|
||||
e.base_corrup = 0;
|
||||
|
||||
return e;
|
||||
}
|
||||
@@ -186,6 +210,12 @@ public:
|
||||
e.alloc_int = row[12] ? static_cast<uint32_t>(strtoul(row[12], nullptr, 10)) : 0;
|
||||
e.alloc_wis = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
|
||||
e.alloc_cha = row[14] ? static_cast<uint32_t>(strtoul(row[14], nullptr, 10)) : 0;
|
||||
e.base_cr = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 0;
|
||||
e.base_fr = row[16] ? static_cast<uint32_t>(strtoul(row[16], nullptr, 10)) : 0;
|
||||
e.base_mr = row[17] ? static_cast<uint32_t>(strtoul(row[17], nullptr, 10)) : 0;
|
||||
e.base_dr = row[18] ? static_cast<uint32_t>(strtoul(row[18], nullptr, 10)) : 0;
|
||||
e.base_pr = row[19] ? static_cast<uint32_t>(strtoul(row[19], nullptr, 10)) : 0;
|
||||
e.base_corrup = row[20] ? static_cast<uint32_t>(strtoul(row[20], nullptr, 10)) : 0;
|
||||
|
||||
return e;
|
||||
}
|
||||
@@ -234,6 +264,12 @@ public:
|
||||
v.push_back(columns[12] + " = " + std::to_string(e.alloc_int));
|
||||
v.push_back(columns[13] + " = " + std::to_string(e.alloc_wis));
|
||||
v.push_back(columns[14] + " = " + std::to_string(e.alloc_cha));
|
||||
v.push_back(columns[15] + " = " + std::to_string(e.base_cr));
|
||||
v.push_back(columns[16] + " = " + std::to_string(e.base_fr));
|
||||
v.push_back(columns[17] + " = " + std::to_string(e.base_mr));
|
||||
v.push_back(columns[18] + " = " + std::to_string(e.base_dr));
|
||||
v.push_back(columns[19] + " = " + std::to_string(e.base_pr));
|
||||
v.push_back(columns[20] + " = " + std::to_string(e.base_corrup));
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
@@ -270,6 +306,12 @@ public:
|
||||
v.push_back(std::to_string(e.alloc_int));
|
||||
v.push_back(std::to_string(e.alloc_wis));
|
||||
v.push_back(std::to_string(e.alloc_cha));
|
||||
v.push_back(std::to_string(e.base_cr));
|
||||
v.push_back(std::to_string(e.base_fr));
|
||||
v.push_back(std::to_string(e.base_mr));
|
||||
v.push_back(std::to_string(e.base_dr));
|
||||
v.push_back(std::to_string(e.base_pr));
|
||||
v.push_back(std::to_string(e.base_corrup));
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
@@ -314,6 +356,12 @@ public:
|
||||
v.push_back(std::to_string(e.alloc_int));
|
||||
v.push_back(std::to_string(e.alloc_wis));
|
||||
v.push_back(std::to_string(e.alloc_cha));
|
||||
v.push_back(std::to_string(e.base_cr));
|
||||
v.push_back(std::to_string(e.base_fr));
|
||||
v.push_back(std::to_string(e.base_mr));
|
||||
v.push_back(std::to_string(e.base_dr));
|
||||
v.push_back(std::to_string(e.base_pr));
|
||||
v.push_back(std::to_string(e.base_corrup));
|
||||
|
||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||
}
|
||||
@@ -362,6 +410,12 @@ public:
|
||||
e.alloc_int = row[12] ? static_cast<uint32_t>(strtoul(row[12], nullptr, 10)) : 0;
|
||||
e.alloc_wis = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
|
||||
e.alloc_cha = row[14] ? static_cast<uint32_t>(strtoul(row[14], nullptr, 10)) : 0;
|
||||
e.base_cr = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 0;
|
||||
e.base_fr = row[16] ? static_cast<uint32_t>(strtoul(row[16], nullptr, 10)) : 0;
|
||||
e.base_mr = row[17] ? static_cast<uint32_t>(strtoul(row[17], nullptr, 10)) : 0;
|
||||
e.base_dr = row[18] ? static_cast<uint32_t>(strtoul(row[18], nullptr, 10)) : 0;
|
||||
e.base_pr = row[19] ? static_cast<uint32_t>(strtoul(row[19], nullptr, 10)) : 0;
|
||||
e.base_corrup = row[20] ? static_cast<uint32_t>(strtoul(row[20], nullptr, 10)) : 0;
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
@@ -401,6 +455,12 @@ public:
|
||||
e.alloc_int = row[12] ? static_cast<uint32_t>(strtoul(row[12], nullptr, 10)) : 0;
|
||||
e.alloc_wis = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
|
||||
e.alloc_cha = row[14] ? static_cast<uint32_t>(strtoul(row[14], nullptr, 10)) : 0;
|
||||
e.base_cr = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 0;
|
||||
e.base_fr = row[16] ? static_cast<uint32_t>(strtoul(row[16], nullptr, 10)) : 0;
|
||||
e.base_mr = row[17] ? static_cast<uint32_t>(strtoul(row[17], nullptr, 10)) : 0;
|
||||
e.base_dr = row[18] ? static_cast<uint32_t>(strtoul(row[18], nullptr, 10)) : 0;
|
||||
e.base_pr = row[19] ? static_cast<uint32_t>(strtoul(row[19], nullptr, 10)) : 0;
|
||||
e.base_corrup = row[20] ? static_cast<uint32_t>(strtoul(row[20], nullptr, 10)) : 0;
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
@@ -490,6 +550,12 @@ public:
|
||||
v.push_back(std::to_string(e.alloc_int));
|
||||
v.push_back(std::to_string(e.alloc_wis));
|
||||
v.push_back(std::to_string(e.alloc_cha));
|
||||
v.push_back(std::to_string(e.base_cr));
|
||||
v.push_back(std::to_string(e.base_fr));
|
||||
v.push_back(std::to_string(e.base_mr));
|
||||
v.push_back(std::to_string(e.base_dr));
|
||||
v.push_back(std::to_string(e.base_pr));
|
||||
v.push_back(std::to_string(e.base_corrup));
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
@@ -527,6 +593,12 @@ public:
|
||||
v.push_back(std::to_string(e.alloc_int));
|
||||
v.push_back(std::to_string(e.alloc_wis));
|
||||
v.push_back(std::to_string(e.alloc_cha));
|
||||
v.push_back(std::to_string(e.base_cr));
|
||||
v.push_back(std::to_string(e.base_fr));
|
||||
v.push_back(std::to_string(e.base_mr));
|
||||
v.push_back(std::to_string(e.base_dr));
|
||||
v.push_back(std::to_string(e.base_pr));
|
||||
v.push_back(std::to_string(e.base_corrup));
|
||||
|
||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||
}
|
||||
|
||||
@@ -123,6 +123,12 @@ public:
|
||||
uint32_t aa_points_old;
|
||||
uint32_t e_last_invsnapshot;
|
||||
time_t deleted_at;
|
||||
uint32_t cold_resist;
|
||||
uint32_t fire_resist;
|
||||
uint32_t magic_resist;
|
||||
uint32_t disease_resist;
|
||||
uint32_t poison_resist;
|
||||
uint32_t corruption_resist;
|
||||
};
|
||||
|
||||
static std::string PrimaryKey()
|
||||
@@ -237,6 +243,12 @@ public:
|
||||
"aa_points_old",
|
||||
"e_last_invsnapshot",
|
||||
"deleted_at",
|
||||
"cold_resist",
|
||||
"fire_resist",
|
||||
"magic_resist",
|
||||
"disease_resist",
|
||||
"poison_resist",
|
||||
"corruption_resist",
|
||||
};
|
||||
}
|
||||
|
||||
@@ -347,6 +359,12 @@ public:
|
||||
"aa_points_old",
|
||||
"e_last_invsnapshot",
|
||||
"UNIX_TIMESTAMP(deleted_at)",
|
||||
"cold_resist",
|
||||
"fire_resist",
|
||||
"magic_resist",
|
||||
"disease_resist",
|
||||
"poison_resist",
|
||||
"corruption_resist",
|
||||
};
|
||||
}
|
||||
|
||||
@@ -491,6 +509,12 @@ public:
|
||||
e.aa_points_old = 0;
|
||||
e.e_last_invsnapshot = 0;
|
||||
e.deleted_at = 0;
|
||||
e.cold_resist = 0;
|
||||
e.fire_resist = 0;
|
||||
e.magic_resist = 0;
|
||||
e.disease_resist = 0;
|
||||
e.poison_resist = 0;
|
||||
e.corruption_resist = 0;
|
||||
|
||||
return e;
|
||||
}
|
||||
@@ -631,6 +655,12 @@ public:
|
||||
e.aa_points_old = row[101] ? static_cast<uint32_t>(strtoul(row[101], nullptr, 10)) : 0;
|
||||
e.e_last_invsnapshot = row[102] ? static_cast<uint32_t>(strtoul(row[102], nullptr, 10)) : 0;
|
||||
e.deleted_at = strtoll(row[103] ? row[103] : "-1", nullptr, 10);
|
||||
e.cold_resist = row[104] ? static_cast<uint32_t>(strtoul(row[104], nullptr, 10)) : 0;
|
||||
e.fire_resist = row[105] ? static_cast<uint32_t>(strtoul(row[105], nullptr, 10)) : 0;
|
||||
e.magic_resist = row[106] ? static_cast<uint32_t>(strtoul(row[106], nullptr, 10)) : 0;
|
||||
e.disease_resist = row[107] ? static_cast<uint32_t>(strtoul(row[107], nullptr, 10)) : 0;
|
||||
e.poison_resist = row[108] ? static_cast<uint32_t>(strtoul(row[108], nullptr, 10)) : 0;
|
||||
e.corruption_resist = row[109] ? static_cast<uint32_t>(strtoul(row[109], nullptr, 10)) : 0;
|
||||
|
||||
return e;
|
||||
}
|
||||
@@ -767,6 +797,12 @@ public:
|
||||
v.push_back(columns[101] + " = " + std::to_string(e.aa_points_old));
|
||||
v.push_back(columns[102] + " = " + std::to_string(e.e_last_invsnapshot));
|
||||
v.push_back(columns[103] + " = FROM_UNIXTIME(" + (e.deleted_at > 0 ? std::to_string(e.deleted_at) : "null") + ")");
|
||||
v.push_back(columns[104] + " = " + std::to_string(e.cold_resist));
|
||||
v.push_back(columns[105] + " = " + std::to_string(e.fire_resist));
|
||||
v.push_back(columns[106] + " = " + std::to_string(e.magic_resist));
|
||||
v.push_back(columns[107] + " = " + std::to_string(e.disease_resist));
|
||||
v.push_back(columns[108] + " = " + std::to_string(e.poison_resist));
|
||||
v.push_back(columns[109] + " = " + std::to_string(e.corruption_resist));
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
@@ -892,6 +928,12 @@ public:
|
||||
v.push_back(std::to_string(e.aa_points_old));
|
||||
v.push_back(std::to_string(e.e_last_invsnapshot));
|
||||
v.push_back("FROM_UNIXTIME(" + (e.deleted_at > 0 ? std::to_string(e.deleted_at) : "null") + ")");
|
||||
v.push_back(std::to_string(e.cold_resist));
|
||||
v.push_back(std::to_string(e.fire_resist));
|
||||
v.push_back(std::to_string(e.magic_resist));
|
||||
v.push_back(std::to_string(e.disease_resist));
|
||||
v.push_back(std::to_string(e.poison_resist));
|
||||
v.push_back(std::to_string(e.corruption_resist));
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
@@ -1025,6 +1067,12 @@ public:
|
||||
v.push_back(std::to_string(e.aa_points_old));
|
||||
v.push_back(std::to_string(e.e_last_invsnapshot));
|
||||
v.push_back("FROM_UNIXTIME(" + (e.deleted_at > 0 ? std::to_string(e.deleted_at) : "null") + ")");
|
||||
v.push_back(std::to_string(e.cold_resist));
|
||||
v.push_back(std::to_string(e.fire_resist));
|
||||
v.push_back(std::to_string(e.magic_resist));
|
||||
v.push_back(std::to_string(e.disease_resist));
|
||||
v.push_back(std::to_string(e.poison_resist));
|
||||
v.push_back(std::to_string(e.corruption_resist));
|
||||
|
||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||
}
|
||||
@@ -1162,6 +1210,12 @@ public:
|
||||
e.aa_points_old = row[101] ? static_cast<uint32_t>(strtoul(row[101], nullptr, 10)) : 0;
|
||||
e.e_last_invsnapshot = row[102] ? static_cast<uint32_t>(strtoul(row[102], nullptr, 10)) : 0;
|
||||
e.deleted_at = strtoll(row[103] ? row[103] : "-1", nullptr, 10);
|
||||
e.cold_resist = row[104] ? static_cast<uint32_t>(strtoul(row[104], nullptr, 10)) : 0;
|
||||
e.fire_resist = row[105] ? static_cast<uint32_t>(strtoul(row[105], nullptr, 10)) : 0;
|
||||
e.magic_resist = row[106] ? static_cast<uint32_t>(strtoul(row[106], nullptr, 10)) : 0;
|
||||
e.disease_resist = row[107] ? static_cast<uint32_t>(strtoul(row[107], nullptr, 10)) : 0;
|
||||
e.poison_resist = row[108] ? static_cast<uint32_t>(strtoul(row[108], nullptr, 10)) : 0;
|
||||
e.corruption_resist = row[109] ? static_cast<uint32_t>(strtoul(row[109], nullptr, 10)) : 0;
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
@@ -1290,6 +1344,12 @@ public:
|
||||
e.aa_points_old = row[101] ? static_cast<uint32_t>(strtoul(row[101], nullptr, 10)) : 0;
|
||||
e.e_last_invsnapshot = row[102] ? static_cast<uint32_t>(strtoul(row[102], nullptr, 10)) : 0;
|
||||
e.deleted_at = strtoll(row[103] ? row[103] : "-1", nullptr, 10);
|
||||
e.cold_resist = row[104] ? static_cast<uint32_t>(strtoul(row[104], nullptr, 10)) : 0;
|
||||
e.fire_resist = row[105] ? static_cast<uint32_t>(strtoul(row[105], nullptr, 10)) : 0;
|
||||
e.magic_resist = row[106] ? static_cast<uint32_t>(strtoul(row[106], nullptr, 10)) : 0;
|
||||
e.disease_resist = row[107] ? static_cast<uint32_t>(strtoul(row[107], nullptr, 10)) : 0;
|
||||
e.poison_resist = row[108] ? static_cast<uint32_t>(strtoul(row[108], nullptr, 10)) : 0;
|
||||
e.corruption_resist = row[109] ? static_cast<uint32_t>(strtoul(row[109], nullptr, 10)) : 0;
|
||||
|
||||
all_entries.push_back(e);
|
||||
}
|
||||
@@ -1468,6 +1528,12 @@ public:
|
||||
v.push_back(std::to_string(e.aa_points_old));
|
||||
v.push_back(std::to_string(e.e_last_invsnapshot));
|
||||
v.push_back("FROM_UNIXTIME(" + (e.deleted_at > 0 ? std::to_string(e.deleted_at) : "null") + ")");
|
||||
v.push_back(std::to_string(e.cold_resist));
|
||||
v.push_back(std::to_string(e.fire_resist));
|
||||
v.push_back(std::to_string(e.magic_resist));
|
||||
v.push_back(std::to_string(e.disease_resist));
|
||||
v.push_back(std::to_string(e.poison_resist));
|
||||
v.push_back(std::to_string(e.corruption_resist));
|
||||
|
||||
auto results = db.QueryDatabase(
|
||||
fmt::format(
|
||||
@@ -1594,6 +1660,12 @@ public:
|
||||
v.push_back(std::to_string(e.aa_points_old));
|
||||
v.push_back(std::to_string(e.e_last_invsnapshot));
|
||||
v.push_back("FROM_UNIXTIME(" + (e.deleted_at > 0 ? std::to_string(e.deleted_at) : "null") + ")");
|
||||
v.push_back(std::to_string(e.cold_resist));
|
||||
v.push_back(std::to_string(e.fire_resist));
|
||||
v.push_back(std::to_string(e.magic_resist));
|
||||
v.push_back(std::to_string(e.disease_resist));
|
||||
v.push_back(std::to_string(e.poison_resist));
|
||||
v.push_back(std::to_string(e.corruption_resist));
|
||||
|
||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||
}
|
||||
|
||||
@@ -56,6 +56,7 @@ SET(world_headers
|
||||
login_server.h
|
||||
login_server_list.h
|
||||
queryserv.h
|
||||
race_combos.h
|
||||
shared_task_manager.h
|
||||
shared_task_world_messaging.h
|
||||
sof_char_create_data.h
|
||||
|
||||
+312
-227
@@ -47,6 +47,7 @@
|
||||
#include "clientlist.h"
|
||||
#include "wguild_mgr.h"
|
||||
#include "sof_char_create_data.h"
|
||||
#include "race_combos.h"
|
||||
#include "../common/zone_store.h"
|
||||
#include "../common/repositories/account_repository.h"
|
||||
#include "../common/repositories/player_event_logs_repository.h"
|
||||
@@ -85,8 +86,8 @@
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
std::vector<RaceClassAllocation> character_create_allocations;
|
||||
std::vector<RaceClassCombos> character_create_race_class_combos;
|
||||
std::vector<CharCreatePointAllocation> character_create_allocations;
|
||||
std::vector<CharCreateCombination> character_create_race_class_combos;
|
||||
|
||||
extern ZSList zoneserver_list;
|
||||
extern LoginServerList loginserverlist;
|
||||
@@ -1642,229 +1643,6 @@ void Client::SendApproveWorld()
|
||||
safe_delete(outapp);
|
||||
}
|
||||
|
||||
bool Client::OPCharCreate(char *name, CharCreate_Struct *cc)
|
||||
{
|
||||
PlayerProfile_Struct pp;
|
||||
EQ::InventoryProfile inv;
|
||||
|
||||
pp.SetPlayerProfileVersion(EQ::versions::ConvertClientVersionToMobVersion(EQ::versions::ConvertClientVersionBitToClientVersion(m_ClientVersionBit)));
|
||||
inv.SetInventoryVersion(EQ::versions::ConvertClientVersionBitToClientVersion(m_ClientVersionBit));
|
||||
inv.SetGMInventory(false); // character cannot have gm flag at this point
|
||||
|
||||
time_t bday = time(nullptr);
|
||||
in_addr in;
|
||||
|
||||
const uint32 stats_sum = (
|
||||
cc->AGI +
|
||||
cc->CHA +
|
||||
cc->DEX +
|
||||
cc->INT +
|
||||
cc->STA +
|
||||
cc->STR +
|
||||
cc->WIS
|
||||
);
|
||||
|
||||
in.s_addr = GetIP();
|
||||
|
||||
LogInfo(
|
||||
"Character creation request from [{}] LS [{}] [{}] [{}]",
|
||||
GetCLE()->LSName(),
|
||||
GetCLE()->LSID(),
|
||||
inet_ntoa(in),
|
||||
GetPort()
|
||||
);
|
||||
LogInfo("Name [{}]", name);
|
||||
LogInfo(
|
||||
"race [{}] class [{}] gender [{}] deity [{}] start_zone [{}] tutorial [{}]",
|
||||
cc->race,
|
||||
cc->class_,
|
||||
cc->gender,
|
||||
cc->deity,
|
||||
cc->start_zone,
|
||||
cc->tutorial ? "true" : "false"
|
||||
);
|
||||
LogInfo(
|
||||
"AGI [{}] CHA [{}] DEX [{}] INT [{}] STA [{}] STR [{}] WIS [{}] Total [{}]",
|
||||
cc->AGI,
|
||||
cc->CHA,
|
||||
cc->DEX,
|
||||
cc->INT,
|
||||
cc->STA,
|
||||
cc->STR,
|
||||
cc->WIS,
|
||||
stats_sum
|
||||
);
|
||||
LogInfo("Face [{}] Eye Colors [{}] [{}]", cc->face, cc->eyecolor1, cc->eyecolor2);
|
||||
LogInfo("Hair [{}] Hair Color [{}]", cc->hairstyle, cc->haircolor);
|
||||
LogInfo("Beard [{}] Beard Color [{}]", cc->beard, cc->beardcolor);
|
||||
|
||||
/* Validate the char creation struct */
|
||||
if (m_ClientVersionBit & EQ::versions::maskSoFAndLater) {
|
||||
if (!CheckCharCreateInfoSoF(cc)) {
|
||||
LogInfo("CheckCharCreateInfo did not validate the request (bad race/class/stats)");
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (!CheckCharCreateInfoTitanium(cc)) {
|
||||
LogInfo("CheckCharCreateInfo did not validate the request (bad race/class/stats)");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/* Convert incoming cc_s to the new PlayerProfile_Struct */
|
||||
memset(&pp, 0, sizeof(PlayerProfile_Struct)); // start building the profile
|
||||
|
||||
strn0cpy(pp.name, name, sizeof(pp.name));
|
||||
|
||||
pp.race = cc->race;
|
||||
pp.class_ = cc->class_;
|
||||
pp.gender = cc->gender;
|
||||
pp.deity = cc->deity;
|
||||
pp.STR = cc->STR;
|
||||
pp.STA = cc->STA;
|
||||
pp.AGI = cc->AGI;
|
||||
pp.DEX = cc->DEX;
|
||||
pp.WIS = cc->WIS;
|
||||
pp.INT = cc->INT;
|
||||
pp.CHA = cc->CHA;
|
||||
pp.face = cc->face;
|
||||
pp.eyecolor1 = cc->eyecolor1;
|
||||
pp.eyecolor2 = cc->eyecolor2;
|
||||
pp.hairstyle = cc->hairstyle;
|
||||
pp.haircolor = cc->haircolor;
|
||||
pp.beard = cc->beard;
|
||||
pp.beardcolor = cc->beardcolor;
|
||||
pp.drakkin_heritage = cc->drakkin_heritage;
|
||||
pp.drakkin_tattoo = cc->drakkin_tattoo;
|
||||
pp.drakkin_details = cc->drakkin_details;
|
||||
pp.birthday = bday;
|
||||
pp.lastlogin = bday;
|
||||
pp.level = 1;
|
||||
pp.points = 5;
|
||||
pp.cur_hp = 1000;
|
||||
pp.hunger_level = 6000;
|
||||
pp.thirst_level = 6000;
|
||||
|
||||
/* Set default skills for everybody */
|
||||
pp.skills[EQ::skills::SkillSwimming] = RuleI(Skills, SwimmingStartValue);
|
||||
pp.skills[EQ::skills::SkillSenseHeading] = RuleI(Skills, SenseHeadingStartValue);
|
||||
|
||||
/* Set Racial and Class specific language and skills */
|
||||
SetRacialLanguages(&pp);
|
||||
SetRaceStartingSkills(&pp);
|
||||
SetClassStartingSkills(&pp);
|
||||
SetClassLanguages(&pp);
|
||||
|
||||
memset(pp.spell_book, std::numeric_limits<uint8>::max(), (sizeof(uint32) * EQ::spells::SPELLBOOK_SIZE));
|
||||
memset(pp.mem_spells, std::numeric_limits<uint8>::max(), (sizeof(uint32) * EQ::spells::SPELL_GEM_COUNT));
|
||||
|
||||
for (auto& b : pp.buffs) {
|
||||
b.spellid = std::numeric_limits<uint16>::max();
|
||||
}
|
||||
|
||||
/* If server is PVP by default, make all character set to it. */
|
||||
pp.pvp = database.GetServerType() == 1 ? 1 : 0;
|
||||
|
||||
/* If it is an SoF Client and the SoF Start Zone rule is set, send new chars there */
|
||||
if (m_ClientVersionBit & EQ::versions::maskSoFAndLater) {
|
||||
LogInfo("Found [SoFStartZoneID] rule setting [{}]", RuleI(World, SoFStartZoneID));
|
||||
if (RuleI(World, SoFStartZoneID) > 0) {
|
||||
pp.zone_id = RuleI(World, SoFStartZoneID);
|
||||
cc->start_zone = pp.zone_id;
|
||||
}
|
||||
} else {
|
||||
LogInfo("Found [TitaniumStartZoneID] rule setting [{}]", RuleI(World, TitaniumStartZoneID));
|
||||
if (RuleI(World, TitaniumStartZoneID) > 0) { /* if there's a startzone variable put them in there */
|
||||
pp.zone_id = RuleI(World, TitaniumStartZoneID);
|
||||
cc->start_zone = pp.zone_id;
|
||||
}
|
||||
}
|
||||
|
||||
/* use normal starting zone logic to either get defaults, or if startzone was set, load that from the db table.*/
|
||||
const bool is_valid_start_zone = content_db.GetStartZone(&pp, cc, m_ClientVersionBit & EQ::versions::maskTitaniumAndEarlier);
|
||||
if (!is_valid_start_zone){
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!pp.zone_id) {
|
||||
pp.zone_id = Zones::QEYNOS;
|
||||
|
||||
pp.x = pp.y = pp.z = -1;
|
||||
}
|
||||
|
||||
for (uint8 slot_id = 1; slot_id < 5; slot_id++) {
|
||||
pp.binds[slot_id].zone_id = pp.zone_id;
|
||||
pp.binds[slot_id].x = pp.x;
|
||||
pp.binds[slot_id].y = pp.y;
|
||||
pp.binds[slot_id].z = pp.z;
|
||||
pp.binds[slot_id].heading = pp.heading;
|
||||
}
|
||||
|
||||
/* Overrides if we have the tutorial flag set! */
|
||||
if (cc->tutorial && RuleB(World, EnableTutorialButton)) {
|
||||
pp.zone_id = RuleI(World, TutorialZoneID);
|
||||
|
||||
auto z = GetZone(pp.zone_id);
|
||||
if (z) {
|
||||
pp.x = z->safe_x;
|
||||
pp.y = z->safe_y;
|
||||
pp.z = z->safe_z;
|
||||
}
|
||||
}
|
||||
|
||||
/* Will either be the same as home or tutorial if enabled. */
|
||||
if (RuleB(World, StartZoneSameAsBindOnCreation)) {
|
||||
pp.binds[0].zone_id = pp.zone_id;
|
||||
pp.binds[0].x = pp.x;
|
||||
pp.binds[0].y = pp.y;
|
||||
pp.binds[0].z = pp.z;
|
||||
pp.binds[0].heading = pp.heading;
|
||||
}
|
||||
|
||||
if (GetZone(pp.zone_id)) {
|
||||
LogInfo(
|
||||
"Current location zone_short_name [{}] zone_id [{}] x [{:.2f}] y [{:.2f}] z [{:.2f}] heading [{:.2f}]",
|
||||
ZoneName(pp.zone_id),
|
||||
pp.zone_id,
|
||||
pp.x,
|
||||
pp.y,
|
||||
pp.z,
|
||||
pp.heading
|
||||
);
|
||||
}
|
||||
|
||||
if (GetZone(pp.binds[0].zone_id)) {
|
||||
LogInfo(
|
||||
"Bind location zone_short_name [{}] zone_id [{}] x [{:.2f}] y [{:.2f}] z [{:.2f}] heading [{:.2f}]",
|
||||
ZoneName(pp.binds[0].zone_id),
|
||||
pp.binds[0].zone_id,
|
||||
pp.binds[0].x,
|
||||
pp.binds[0].y,
|
||||
pp.binds[0].z,
|
||||
pp.binds[4].heading
|
||||
);
|
||||
}
|
||||
|
||||
if (GetZone(pp.binds[4].zone_id)) {
|
||||
LogInfo(
|
||||
"Home location zone_short_name [{}] zone_id [{}] x [{:.2f}] y [{:.2f}] z [{:.2f}] heading [{:.2f}]",
|
||||
ZoneName(pp.binds[4].zone_id),
|
||||
pp.binds[4].zone_id,
|
||||
pp.binds[4].x,
|
||||
pp.binds[4].y,
|
||||
pp.binds[4].z,
|
||||
pp.binds[4].heading
|
||||
);
|
||||
}
|
||||
|
||||
content_db.SetStartingItems(&pp, &inv, pp.race, pp.class_, pp.deity, pp.zone_id, pp.name, GetAdmin());
|
||||
|
||||
const bool success = StoreCharacter(GetAccountID(), &pp, &inv);
|
||||
|
||||
LogInfo("Character creation {} for [{}]", success ? "succeeded" : "failed", pp.name);
|
||||
return success;
|
||||
}
|
||||
|
||||
// returns true if the request is ok, false if there's an error
|
||||
bool CheckCharCreateInfoSoF(CharCreate_Struct* cc)
|
||||
{
|
||||
@@ -1873,7 +1651,7 @@ bool CheckCharCreateInfoSoF(CharCreate_Struct *cc)
|
||||
|
||||
LogInfo("Validating char creation info");
|
||||
|
||||
RaceClassCombos class_combo;
|
||||
CharCreateCombination class_combo;
|
||||
bool found = false;
|
||||
int combos = character_create_race_class_combos.size();
|
||||
for (int i = 0; i < combos; ++i) {
|
||||
@@ -1893,7 +1671,7 @@ bool CheckCharCreateInfoSoF(CharCreate_Struct *cc)
|
||||
}
|
||||
|
||||
uint32 allocs = character_create_allocations.size();
|
||||
RaceClassAllocation allocation = {0};
|
||||
CharCreatePointAllocation allocation = { 0 };
|
||||
found = false;
|
||||
for (int i = 0; i < allocs; ++i) {
|
||||
if (character_create_allocations[i].Index == class_combo.AllocationIndex) {
|
||||
@@ -2132,6 +1910,313 @@ bool CheckCharCreateInfoTitanium(CharCreate_Struct *cc)
|
||||
return Charerrors == 0;
|
||||
}
|
||||
|
||||
//TODO: these hard coded values should be settable somewhere somehow.
|
||||
//Also they're not 100% accurate so if I don't make them settable somehow
|
||||
//we need to go back and match them to the logic that was ripped out of zone
|
||||
void GetResistsForCharacterCreate(CharCreate_Struct* cc,
|
||||
bool sofAndLater,
|
||||
uint32 &cold_resist,
|
||||
uint32& fire_resist,
|
||||
uint32& magic_resist,
|
||||
uint32& disease_resist,
|
||||
uint32& poison_resist,
|
||||
uint32& corruption_resist)
|
||||
{
|
||||
if (!sofAndLater) {
|
||||
cold_resist = 25;
|
||||
fire_resist = 25;
|
||||
magic_resist = 25;
|
||||
disease_resist = 15;
|
||||
poison_resist = 15;
|
||||
corruption_resist = 15;
|
||||
return;
|
||||
}
|
||||
|
||||
CharCreateCombination class_combo;
|
||||
bool found = false;
|
||||
int combos = character_create_race_class_combos.size();
|
||||
for (int i = 0; i < combos; ++i) {
|
||||
if (character_create_race_class_combos[i].Class == cc->class_ &&
|
||||
character_create_race_class_combos[i].Race == cc->race &&
|
||||
character_create_race_class_combos[i].Deity == cc->deity &&
|
||||
character_create_race_class_combos[i].Zone == cc->start_zone) {
|
||||
class_combo = character_create_race_class_combos[i];
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
cold_resist = 25;
|
||||
fire_resist = 25;
|
||||
magic_resist = 25;
|
||||
disease_resist = 15;
|
||||
poison_resist = 15;
|
||||
corruption_resist = 15;
|
||||
return;
|
||||
}
|
||||
|
||||
CharCreatePointAllocation allocation;
|
||||
found = false;
|
||||
combos = character_create_allocations.size();
|
||||
for (int i = 0; i < combos; ++i) {
|
||||
if (character_create_allocations[i].Index == class_combo.AllocationIndex) {
|
||||
allocation = character_create_allocations[i];
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
cold_resist = 25;
|
||||
fire_resist = 25;
|
||||
magic_resist = 25;
|
||||
disease_resist = 15;
|
||||
poison_resist = 15;
|
||||
corruption_resist = 15;
|
||||
return;
|
||||
}
|
||||
|
||||
cold_resist = allocation.BaseResists[0];
|
||||
fire_resist = allocation.BaseResists[1];
|
||||
magic_resist = allocation.BaseResists[2];
|
||||
disease_resist = allocation.BaseResists[3];
|
||||
poison_resist = allocation.BaseResists[4];
|
||||
corruption_resist = allocation.BaseResists[5];
|
||||
}
|
||||
|
||||
bool Client::OPCharCreate(char *name, CharCreate_Struct *cc)
|
||||
{
|
||||
PlayerProfile_Struct pp;
|
||||
EQ::InventoryProfile inv;
|
||||
|
||||
pp.SetPlayerProfileVersion(EQ::versions::ConvertClientVersionToMobVersion(EQ::versions::ConvertClientVersionBitToClientVersion(m_ClientVersionBit)));
|
||||
inv.SetInventoryVersion(EQ::versions::ConvertClientVersionBitToClientVersion(m_ClientVersionBit));
|
||||
inv.SetGMInventory(false); // character cannot have gm flag at this point
|
||||
|
||||
time_t bday = time(nullptr);
|
||||
in_addr in;
|
||||
|
||||
const uint32 stats_sum = (
|
||||
cc->AGI +
|
||||
cc->CHA +
|
||||
cc->DEX +
|
||||
cc->INT +
|
||||
cc->STA +
|
||||
cc->STR +
|
||||
cc->WIS
|
||||
);
|
||||
|
||||
in.s_addr = GetIP();
|
||||
|
||||
LogInfo(
|
||||
"Character creation request from [{}] LS [{}] [{}] [{}]",
|
||||
GetCLE()->LSName(),
|
||||
GetCLE()->LSID(),
|
||||
inet_ntoa(in),
|
||||
GetPort()
|
||||
);
|
||||
LogInfo("Name [{}]", name);
|
||||
LogInfo(
|
||||
"race [{}] class [{}] gender [{}] deity [{}] start_zone [{}] tutorial [{}]",
|
||||
cc->race,
|
||||
cc->class_,
|
||||
cc->gender,
|
||||
cc->deity,
|
||||
cc->start_zone,
|
||||
cc->tutorial ? "true" : "false"
|
||||
);
|
||||
LogInfo(
|
||||
"AGI [{}] CHA [{}] DEX [{}] INT [{}] STA [{}] STR [{}] WIS [{}] Total [{}]",
|
||||
cc->AGI,
|
||||
cc->CHA,
|
||||
cc->DEX,
|
||||
cc->INT,
|
||||
cc->STA,
|
||||
cc->STR,
|
||||
cc->WIS,
|
||||
stats_sum
|
||||
);
|
||||
LogInfo("Face [{}] Eye Colors [{}] [{}]", cc->face, cc->eyecolor1, cc->eyecolor2);
|
||||
LogInfo("Hair [{}] Hair Color [{}]", cc->hairstyle, cc->haircolor);
|
||||
LogInfo("Beard [{}] Beard Color [{}]", cc->beard, cc->beardcolor);
|
||||
|
||||
/* Validate the char creation struct */
|
||||
if (m_ClientVersionBit & EQ::versions::maskSoFAndLater) {
|
||||
if (!CheckCharCreateInfoSoF(cc)) {
|
||||
LogInfo("CheckCharCreateInfo did not validate the request (bad race/class/stats)");
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (!CheckCharCreateInfoTitanium(cc)) {
|
||||
LogInfo("CheckCharCreateInfo did not validate the request (bad race/class/stats)");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/* Convert incoming cc_s to the new PlayerProfile_Struct */
|
||||
memset(&pp, 0, sizeof(PlayerProfile_Struct)); // start building the profile
|
||||
|
||||
strn0cpy(pp.name, name, sizeof(pp.name));
|
||||
|
||||
pp.race = cc->race;
|
||||
pp.class_ = cc->class_;
|
||||
pp.gender = cc->gender;
|
||||
pp.deity = cc->deity;
|
||||
pp.STR = cc->STR;
|
||||
pp.STA = cc->STA;
|
||||
pp.AGI = cc->AGI;
|
||||
pp.DEX = cc->DEX;
|
||||
pp.WIS = cc->WIS;
|
||||
pp.INT = cc->INT;
|
||||
pp.CHA = cc->CHA;
|
||||
pp.face = cc->face;
|
||||
pp.eyecolor1 = cc->eyecolor1;
|
||||
pp.eyecolor2 = cc->eyecolor2;
|
||||
pp.hairstyle = cc->hairstyle;
|
||||
pp.haircolor = cc->haircolor;
|
||||
pp.beard = cc->beard;
|
||||
pp.beardcolor = cc->beardcolor;
|
||||
pp.drakkin_heritage = cc->drakkin_heritage;
|
||||
pp.drakkin_tattoo = cc->drakkin_tattoo;
|
||||
pp.drakkin_details = cc->drakkin_details;
|
||||
pp.birthday = bday;
|
||||
pp.lastlogin = bday;
|
||||
pp.level = 1;
|
||||
pp.points = 5;
|
||||
pp.cur_hp = 1000;
|
||||
pp.hunger_level = 6000;
|
||||
pp.thirst_level = 6000;
|
||||
|
||||
GetResistsForCharacterCreate(cc,
|
||||
m_ClientVersionBit & EQ::versions::maskSoFAndLater,
|
||||
pp.cold_resist,
|
||||
pp.fire_resist,
|
||||
pp.magic_resist,
|
||||
pp.disease_resist,
|
||||
pp.poison_resist,
|
||||
pp.corruption_resist);
|
||||
|
||||
/* Set default skills for everybody */
|
||||
pp.skills[EQ::skills::SkillSwimming] = RuleI(Skills, SwimmingStartValue);
|
||||
pp.skills[EQ::skills::SkillSenseHeading] = RuleI(Skills, SenseHeadingStartValue);
|
||||
|
||||
/* Set Racial and Class specific language and skills */
|
||||
SetRacialLanguages(&pp);
|
||||
SetRaceStartingSkills(&pp);
|
||||
SetClassStartingSkills(&pp);
|
||||
SetClassLanguages(&pp);
|
||||
|
||||
memset(pp.spell_book, std::numeric_limits<uint8>::max(), (sizeof(uint32) * EQ::spells::SPELLBOOK_SIZE));
|
||||
memset(pp.mem_spells, std::numeric_limits<uint8>::max(), (sizeof(uint32) * EQ::spells::SPELL_GEM_COUNT));
|
||||
|
||||
for (auto& b : pp.buffs) {
|
||||
b.spellid = std::numeric_limits<uint16>::max();
|
||||
}
|
||||
|
||||
/* If server is PVP by default, make all character set to it. */
|
||||
pp.pvp = database.GetServerType() == 1 ? 1 : 0;
|
||||
|
||||
/* If it is an SoF Client and the SoF Start Zone rule is set, send new chars there */
|
||||
if (m_ClientVersionBit & EQ::versions::maskSoFAndLater) {
|
||||
LogInfo("Found [SoFStartZoneID] rule setting [{}]", RuleI(World, SoFStartZoneID));
|
||||
if (RuleI(World, SoFStartZoneID) > 0) {
|
||||
pp.zone_id = RuleI(World, SoFStartZoneID);
|
||||
cc->start_zone = pp.zone_id;
|
||||
}
|
||||
} else {
|
||||
LogInfo("Found [TitaniumStartZoneID] rule setting [{}]", RuleI(World, TitaniumStartZoneID));
|
||||
if (RuleI(World, TitaniumStartZoneID) > 0) { /* if there's a startzone variable put them in there */
|
||||
pp.zone_id = RuleI(World, TitaniumStartZoneID);
|
||||
cc->start_zone = pp.zone_id;
|
||||
}
|
||||
}
|
||||
|
||||
/* use normal starting zone logic to either get defaults, or if startzone was set, load that from the db table.*/
|
||||
const bool is_valid_start_zone = content_db.GetStartZone(&pp, cc, m_ClientVersionBit & EQ::versions::maskTitaniumAndEarlier);
|
||||
if (!is_valid_start_zone){
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!pp.zone_id) {
|
||||
pp.zone_id = Zones::QEYNOS;
|
||||
|
||||
pp.x = pp.y = pp.z = -1;
|
||||
}
|
||||
|
||||
for (uint8 slot_id = 1; slot_id < 5; slot_id++) {
|
||||
pp.binds[slot_id].zone_id = pp.zone_id;
|
||||
pp.binds[slot_id].x = pp.x;
|
||||
pp.binds[slot_id].y = pp.y;
|
||||
pp.binds[slot_id].z = pp.z;
|
||||
pp.binds[slot_id].heading = pp.heading;
|
||||
}
|
||||
|
||||
/* Overrides if we have the tutorial flag set! */
|
||||
if (cc->tutorial && RuleB(World, EnableTutorialButton)) {
|
||||
pp.zone_id = RuleI(World, TutorialZoneID);
|
||||
|
||||
auto z = GetZone(pp.zone_id);
|
||||
if (z) {
|
||||
pp.x = z->safe_x;
|
||||
pp.y = z->safe_y;
|
||||
pp.z = z->safe_z;
|
||||
}
|
||||
}
|
||||
|
||||
/* Will either be the same as home or tutorial if enabled. */
|
||||
if (RuleB(World, StartZoneSameAsBindOnCreation)) {
|
||||
pp.binds[0].zone_id = pp.zone_id;
|
||||
pp.binds[0].x = pp.x;
|
||||
pp.binds[0].y = pp.y;
|
||||
pp.binds[0].z = pp.z;
|
||||
pp.binds[0].heading = pp.heading;
|
||||
}
|
||||
|
||||
if (GetZone(pp.zone_id)) {
|
||||
LogInfo(
|
||||
"Current location zone_short_name [{}] zone_id [{}] x [{:.2f}] y [{:.2f}] z [{:.2f}] heading [{:.2f}]",
|
||||
ZoneName(pp.zone_id),
|
||||
pp.zone_id,
|
||||
pp.x,
|
||||
pp.y,
|
||||
pp.z,
|
||||
pp.heading
|
||||
);
|
||||
}
|
||||
|
||||
if (GetZone(pp.binds[0].zone_id)) {
|
||||
LogInfo(
|
||||
"Bind location zone_short_name [{}] zone_id [{}] x [{:.2f}] y [{:.2f}] z [{:.2f}] heading [{:.2f}]",
|
||||
ZoneName(pp.binds[0].zone_id),
|
||||
pp.binds[0].zone_id,
|
||||
pp.binds[0].x,
|
||||
pp.binds[0].y,
|
||||
pp.binds[0].z,
|
||||
pp.binds[4].heading
|
||||
);
|
||||
}
|
||||
|
||||
if (GetZone(pp.binds[4].zone_id)) {
|
||||
LogInfo(
|
||||
"Home location zone_short_name [{}] zone_id [{}] x [{:.2f}] y [{:.2f}] z [{:.2f}] heading [{:.2f}]",
|
||||
ZoneName(pp.binds[4].zone_id),
|
||||
pp.binds[4].zone_id,
|
||||
pp.binds[4].x,
|
||||
pp.binds[4].y,
|
||||
pp.binds[4].z,
|
||||
pp.binds[4].heading
|
||||
);
|
||||
}
|
||||
|
||||
content_db.SetStartingItems(&pp, &inv, pp.race, pp.class_, pp.deity, pp.zone_id, pp.name, GetAdmin());
|
||||
|
||||
const bool success = StoreCharacter(GetAccountID(), &pp, &inv);
|
||||
|
||||
LogInfo("Character creation {} for [{}]", success ? "succeeded" : "failed", pp.name);
|
||||
return success;
|
||||
}
|
||||
|
||||
void Client::SetClassStartingSkills(PlayerProfile_Struct *pp)
|
||||
{
|
||||
for (uint32 i = 0; i <= EQ::skills::HIGHEST_SKILL; ++i) {
|
||||
|
||||
@@ -122,7 +122,4 @@ private:
|
||||
void RecordPossibleHack(const std::string& message);
|
||||
};
|
||||
|
||||
bool CheckCharCreateInfoSoF(CharCreate_Struct *cc);
|
||||
bool CheckCharCreateInfoTitanium(CharCreate_Struct *cc);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
#pragma once
|
||||
|
||||
struct CharCreatePointAllocation
|
||||
{
|
||||
unsigned int Index;
|
||||
unsigned int BaseStats[7];
|
||||
unsigned int DefaultPointAllocation[7];
|
||||
unsigned int BaseResists[7];
|
||||
};
|
||||
|
||||
struct CharCreateCombination {
|
||||
unsigned int ExpansionRequired;
|
||||
unsigned int Race;
|
||||
unsigned int Class;
|
||||
unsigned int Deity;
|
||||
unsigned int AllocationIndex;
|
||||
unsigned int Zone;
|
||||
};
|
||||
+11
-4
@@ -25,14 +25,15 @@
|
||||
#include <cstdlib>
|
||||
#include <vector>
|
||||
#include "sof_char_create_data.h"
|
||||
#include "race_combos.h"
|
||||
#include "../common/repositories/character_instance_safereturns_repository.h"
|
||||
#include "../common/repositories/criteria/content_filter_criteria.h"
|
||||
#include "../common/zone_store.h"
|
||||
|
||||
WorldDatabase database;
|
||||
WorldDatabase content_db;
|
||||
extern std::vector<RaceClassAllocation> character_create_allocations;
|
||||
extern std::vector<RaceClassCombos> character_create_race_class_combos;
|
||||
extern std::vector<CharCreatePointAllocation> character_create_allocations;
|
||||
extern std::vector<CharCreateCombination> character_create_race_class_combos;
|
||||
|
||||
|
||||
/**
|
||||
@@ -807,7 +808,7 @@ bool WorldDatabase::LoadCharacterCreateAllocations()
|
||||
return false;
|
||||
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
RaceClassAllocation allocate;
|
||||
CharCreatePointAllocation allocate;
|
||||
allocate.Index = Strings::ToInt(row[0]);
|
||||
allocate.BaseStats[0] = Strings::ToInt(row[1]);
|
||||
allocate.BaseStats[3] = Strings::ToInt(row[2]);
|
||||
@@ -823,6 +824,12 @@ bool WorldDatabase::LoadCharacterCreateAllocations()
|
||||
allocate.DefaultPointAllocation[4] = Strings::ToInt(row[12]);
|
||||
allocate.DefaultPointAllocation[5] = Strings::ToInt(row[13]);
|
||||
allocate.DefaultPointAllocation[6] = Strings::ToInt(row[14]);
|
||||
allocate.BaseResists[0] = Strings::ToInt(row[15]);
|
||||
allocate.BaseResists[1] = Strings::ToInt(row[16]);
|
||||
allocate.BaseResists[2] = Strings::ToInt(row[17]);
|
||||
allocate.BaseResists[3] = Strings::ToInt(row[18]);
|
||||
allocate.BaseResists[4] = Strings::ToInt(row[19]);
|
||||
allocate.BaseResists[5] = Strings::ToInt(row[20]);
|
||||
|
||||
character_create_allocations.push_back(allocate);
|
||||
}
|
||||
@@ -840,7 +847,7 @@ bool WorldDatabase::LoadCharacterCreateCombos()
|
||||
return false;
|
||||
|
||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||
RaceClassCombos combo;
|
||||
CharCreateCombination combo;
|
||||
combo.AllocationIndex = Strings::ToInt(row[0]);
|
||||
combo.Race = Strings::ToInt(row[1]);
|
||||
combo.Class = Strings::ToInt(row[2]);
|
||||
|
||||
+1
-1
@@ -597,7 +597,7 @@ public:
|
||||
inline uint8 GetBaseINT() const { return m_pp.INT; }
|
||||
inline uint8 GetBaseAGI() const { return m_pp.AGI; }
|
||||
inline uint8 GetBaseWIS() const { return m_pp.WIS; }
|
||||
inline uint8 GetBaseCorrup() const { return 15; } // Same for all
|
||||
inline uint8 GetBaseCorrup() const { return m_pp.corruption_resist; }
|
||||
inline uint8 GetBasePhR() const { return 0; } // Guessing at 0 as base
|
||||
|
||||
inline virtual int32 GetHeroicSTR() const { return itembonuses.HeroicSTR; }
|
||||
|
||||
+5
-295
@@ -1009,65 +1009,7 @@ int Client::CalcHaste()
|
||||
//in Mob::ResistSpell
|
||||
int32 Client::CalcMR()
|
||||
{
|
||||
//racial bases
|
||||
switch (GetBaseRace()) {
|
||||
case HUMAN:
|
||||
MR = 25;
|
||||
break;
|
||||
case BARBARIAN:
|
||||
MR = 25;
|
||||
break;
|
||||
case ERUDITE:
|
||||
MR = 30;
|
||||
break;
|
||||
case WOOD_ELF:
|
||||
MR = 25;
|
||||
break;
|
||||
case HIGH_ELF:
|
||||
MR = 25;
|
||||
break;
|
||||
case DARK_ELF:
|
||||
MR = 25;
|
||||
break;
|
||||
case HALF_ELF:
|
||||
MR = 25;
|
||||
break;
|
||||
case DWARF:
|
||||
MR = 30;
|
||||
break;
|
||||
case TROLL:
|
||||
MR = 25;
|
||||
break;
|
||||
case OGRE:
|
||||
MR = 25;
|
||||
break;
|
||||
case HALFLING:
|
||||
MR = 25;
|
||||
break;
|
||||
case GNOME:
|
||||
MR = 25;
|
||||
break;
|
||||
case IKSAR:
|
||||
MR = 25;
|
||||
break;
|
||||
case VAHSHIR:
|
||||
MR = 25;
|
||||
break;
|
||||
case FROGLOK:
|
||||
MR = 30;
|
||||
break;
|
||||
case DRAKKIN:
|
||||
{
|
||||
MR = 25;
|
||||
if (GetDrakkinHeritage() == 2)
|
||||
MR += 10;
|
||||
else if (GetDrakkinHeritage() == 5)
|
||||
MR += 2;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
MR = 20;
|
||||
}
|
||||
MR = m_pp.magic_resist;
|
||||
MR += itembonuses.MR + spellbonuses.MR + aabonuses.MR;
|
||||
if (GetClass() == Class::Warrior || GetClass() == Class::Berserker) {
|
||||
MR += GetLevel() / 2;
|
||||
@@ -1083,65 +1025,7 @@ int32 Client::CalcMR()
|
||||
|
||||
int32 Client::CalcFR()
|
||||
{
|
||||
//racial bases
|
||||
switch (GetBaseRace()) {
|
||||
case HUMAN:
|
||||
FR = 25;
|
||||
break;
|
||||
case BARBARIAN:
|
||||
FR = 25;
|
||||
break;
|
||||
case ERUDITE:
|
||||
FR = 25;
|
||||
break;
|
||||
case WOOD_ELF:
|
||||
FR = 25;
|
||||
break;
|
||||
case HIGH_ELF:
|
||||
FR = 25;
|
||||
break;
|
||||
case DARK_ELF:
|
||||
FR = 25;
|
||||
break;
|
||||
case HALF_ELF:
|
||||
FR = 25;
|
||||
break;
|
||||
case DWARF:
|
||||
FR = 25;
|
||||
break;
|
||||
case TROLL:
|
||||
FR = 5;
|
||||
break;
|
||||
case OGRE:
|
||||
FR = 25;
|
||||
break;
|
||||
case HALFLING:
|
||||
FR = 25;
|
||||
break;
|
||||
case GNOME:
|
||||
FR = 25;
|
||||
break;
|
||||
case IKSAR:
|
||||
FR = 30;
|
||||
break;
|
||||
case VAHSHIR:
|
||||
FR = 25;
|
||||
break;
|
||||
case FROGLOK:
|
||||
FR = 25;
|
||||
break;
|
||||
case DRAKKIN:
|
||||
{
|
||||
FR = 25;
|
||||
if (GetDrakkinHeritage() == 0)
|
||||
FR += 10;
|
||||
else if (GetDrakkinHeritage() == 5)
|
||||
FR += 2;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
FR = 20;
|
||||
}
|
||||
FR = m_pp.fire_resist;
|
||||
int c = GetClass();
|
||||
if (c == Class::Ranger) {
|
||||
FR += 4;
|
||||
@@ -1169,65 +1053,7 @@ int32 Client::CalcFR()
|
||||
|
||||
int32 Client::CalcDR()
|
||||
{
|
||||
//racial bases
|
||||
switch (GetBaseRace()) {
|
||||
case HUMAN:
|
||||
DR = 15;
|
||||
break;
|
||||
case BARBARIAN:
|
||||
DR = 15;
|
||||
break;
|
||||
case ERUDITE:
|
||||
DR = 10;
|
||||
break;
|
||||
case WOOD_ELF:
|
||||
DR = 15;
|
||||
break;
|
||||
case HIGH_ELF:
|
||||
DR = 15;
|
||||
break;
|
||||
case DARK_ELF:
|
||||
DR = 15;
|
||||
break;
|
||||
case HALF_ELF:
|
||||
DR = 15;
|
||||
break;
|
||||
case DWARF:
|
||||
DR = 15;
|
||||
break;
|
||||
case TROLL:
|
||||
DR = 15;
|
||||
break;
|
||||
case OGRE:
|
||||
DR = 15;
|
||||
break;
|
||||
case HALFLING:
|
||||
DR = 20;
|
||||
break;
|
||||
case GNOME:
|
||||
DR = 15;
|
||||
break;
|
||||
case IKSAR:
|
||||
DR = 15;
|
||||
break;
|
||||
case VAHSHIR:
|
||||
DR = 15;
|
||||
break;
|
||||
case FROGLOK:
|
||||
DR = 15;
|
||||
break;
|
||||
case DRAKKIN:
|
||||
{
|
||||
DR = 15;
|
||||
if (GetDrakkinHeritage() == 1)
|
||||
DR += 10;
|
||||
else if (GetDrakkinHeritage() == 5)
|
||||
DR += 2;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
DR = 15;
|
||||
}
|
||||
DR = m_pp.disease_resist;
|
||||
int c = GetClass();
|
||||
// the monk one is part of base resist
|
||||
if (c == Class::Monk) {
|
||||
@@ -1261,65 +1087,7 @@ int32 Client::CalcDR()
|
||||
|
||||
int32 Client::CalcPR()
|
||||
{
|
||||
//racial bases
|
||||
switch (GetBaseRace()) {
|
||||
case HUMAN:
|
||||
PR = 15;
|
||||
break;
|
||||
case BARBARIAN:
|
||||
PR = 15;
|
||||
break;
|
||||
case ERUDITE:
|
||||
PR = 15;
|
||||
break;
|
||||
case WOOD_ELF:
|
||||
PR = 15;
|
||||
break;
|
||||
case HIGH_ELF:
|
||||
PR = 15;
|
||||
break;
|
||||
case DARK_ELF:
|
||||
PR = 15;
|
||||
break;
|
||||
case HALF_ELF:
|
||||
PR = 15;
|
||||
break;
|
||||
case DWARF:
|
||||
PR = 20;
|
||||
break;
|
||||
case TROLL:
|
||||
PR = 15;
|
||||
break;
|
||||
case OGRE:
|
||||
PR = 15;
|
||||
break;
|
||||
case HALFLING:
|
||||
PR = 20;
|
||||
break;
|
||||
case GNOME:
|
||||
PR = 15;
|
||||
break;
|
||||
case IKSAR:
|
||||
PR = 15;
|
||||
break;
|
||||
case VAHSHIR:
|
||||
PR = 15;
|
||||
break;
|
||||
case FROGLOK:
|
||||
PR = 30;
|
||||
break;
|
||||
case DRAKKIN:
|
||||
{
|
||||
PR = 15;
|
||||
if (GetDrakkinHeritage() == 3)
|
||||
PR += 10;
|
||||
else if (GetDrakkinHeritage() == 5)
|
||||
PR += 2;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
PR = 15;
|
||||
}
|
||||
PR = m_pp.poison_resist;
|
||||
int c = GetClass();
|
||||
// this monk bonus is part of the base
|
||||
if (c == Class::Monk) {
|
||||
@@ -1353,65 +1121,7 @@ int32 Client::CalcPR()
|
||||
|
||||
int32 Client::CalcCR()
|
||||
{
|
||||
//racial bases
|
||||
switch (GetBaseRace()) {
|
||||
case HUMAN:
|
||||
CR = 25;
|
||||
break;
|
||||
case BARBARIAN:
|
||||
CR = 35;
|
||||
break;
|
||||
case ERUDITE:
|
||||
CR = 25;
|
||||
break;
|
||||
case WOOD_ELF:
|
||||
CR = 25;
|
||||
break;
|
||||
case HIGH_ELF:
|
||||
CR = 25;
|
||||
break;
|
||||
case DARK_ELF:
|
||||
CR = 25;
|
||||
break;
|
||||
case HALF_ELF:
|
||||
CR = 25;
|
||||
break;
|
||||
case DWARF:
|
||||
CR = 25;
|
||||
break;
|
||||
case TROLL:
|
||||
CR = 25;
|
||||
break;
|
||||
case OGRE:
|
||||
CR = 25;
|
||||
break;
|
||||
case HALFLING:
|
||||
CR = 25;
|
||||
break;
|
||||
case GNOME:
|
||||
CR = 25;
|
||||
break;
|
||||
case IKSAR:
|
||||
CR = 15;
|
||||
break;
|
||||
case VAHSHIR:
|
||||
CR = 25;
|
||||
break;
|
||||
case FROGLOK:
|
||||
CR = 25;
|
||||
break;
|
||||
case DRAKKIN:
|
||||
{
|
||||
CR = 25;
|
||||
if (GetDrakkinHeritage() == 4)
|
||||
CR += 10;
|
||||
else if (GetDrakkinHeritage() == 5)
|
||||
CR += 2;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
CR = 25;
|
||||
}
|
||||
CR = m_pp.cold_resist;
|
||||
int c = GetClass();
|
||||
if (c == Class::Ranger || c == Class::Beastlord) {
|
||||
CR += 4;
|
||||
|
||||
@@ -561,6 +561,12 @@ bool ZoneDatabase::LoadCharacterData(uint32 character_id, PlayerProfile_Struct*
|
||||
m_epp->expended_aa = e.e_expended_aa_spent;
|
||||
m_epp->last_invsnapshot_time = e.e_last_invsnapshot;
|
||||
m_epp->next_invsnapshot_time = m_epp->last_invsnapshot_time + (RuleI(Character, InvSnapshotMinIntervalM) * 60);
|
||||
pp->cold_resist = e.cold_resist;
|
||||
pp->fire_resist = e.fire_resist;
|
||||
pp->magic_resist = e.magic_resist;
|
||||
pp->disease_resist = e.disease_resist;
|
||||
pp->poison_resist = e.poison_resist;
|
||||
pp->corruption_resist = e.corruption_resist;
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1158,6 +1164,12 @@ bool ZoneDatabase::SaveCharacterData(
|
||||
e.e_expended_aa_spent = m_epp->expended_aa;
|
||||
e.e_last_invsnapshot = m_epp->last_invsnapshot_time;
|
||||
e.mailkey = c->GetMailKeyFull();
|
||||
e.cold_resist = pp->cold_resist;
|
||||
e.fire_resist = pp->fire_resist;
|
||||
e.magic_resist = pp->magic_resist;
|
||||
e.disease_resist = pp->disease_resist;
|
||||
e.poison_resist = pp->poison_resist;
|
||||
e.corruption_resist = pp->corruption_resist;
|
||||
|
||||
const int replaced = CharacterDataRepository::ReplaceOne(database, e);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user