mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-16 18:52:22 +00:00
[Quest API] Add EVENT_CRYSTAL_GAIN and EVENT_CRYSTAL_LOSS to Perl/Lua (#3735)
* [Quest API] Add EVENT_CRYSTAL_GAIN and EVENT_CRYSTAL_LOSS - Add `$client->AddEbonCrystals(amount)`. - Add `$client->AddRadiantCrystals(amount)`. - Add `$client->RemoveEbonCrystals(amount)`. - Add `$client->RemoveRadiantCrystals(amount)`. - Add `EVENT_CRYSTAL_GAIN`. - Add `EVENT_CRYSTAL_LOSS`. - Export `$ebon_amount`, `$radiant_amount`, and `$is_reclaim`. - Add `client:AddEbonCrystals(amount)`. - Add `client:AddRadiantCrystals(amount)`. - Add `client:RemoveEbonCrystals(amount)`. - Add `client:RemoveRadiantCrystals(amount)`. - Add `event_crystal_gain`. - Add `event_crystal_loss`. - Export `e.ebon_amount`, `e.radiant_amount`, and `e.is_reclaim`. - Allows operators to add or remove Ebon/Radiant Crystals directly. - Allows operators to track gain/loss of Ebon/Radiant Crystals. * Update perl_client.cpp * Update lua_client.cpp
This commit is contained in:
+20
-29
@@ -5475,59 +5475,50 @@ void Client::Handle_OP_CreateObject(const EQApplicationPacket *app)
|
||||
void Client::Handle_OP_CrystalCreate(const EQApplicationPacket *app)
|
||||
{
|
||||
VERIFY_PACKET_LENGTH(OP_CrystalCreate, app, CrystalReclaim_Struct);
|
||||
CrystalReclaim_Struct *cr = (CrystalReclaim_Struct*)app->pBuffer;
|
||||
auto *cr = (CrystalReclaim_Struct *) app->pBuffer;
|
||||
|
||||
const uint32 requestQty = cr->amount;
|
||||
const bool isRadiant = cr->type == 4;
|
||||
const bool isEbon = cr->type == 5;
|
||||
const uint32 quantity = cr->amount;
|
||||
const bool is_radiant = cr->type == CrystalReclaimTypes::Radiant;
|
||||
const bool is_ebon = cr->type == CrystalReclaimTypes::Ebon;
|
||||
|
||||
// Check: Valid type requested.
|
||||
if (!isRadiant && !isEbon) {
|
||||
if (!is_radiant && !is_ebon) {
|
||||
return;
|
||||
}
|
||||
// Check: Valid quantity requested.
|
||||
if (requestQty < 1) {
|
||||
|
||||
if (quantity < 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check: Valid client state to make request.
|
||||
// In this situation the client is either desynced or attempting an exploit.
|
||||
const uint32 currentQty = isRadiant ? GetRadiantCrystals() : GetEbonCrystals();
|
||||
if (currentQty == 0) {
|
||||
const uint32 current_quantity = is_radiant ? GetRadiantCrystals() : GetEbonCrystals();
|
||||
if (!current_quantity) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Prevent the client from creating more than they have.
|
||||
const uint32 amount = EQ::ClampUpper(requestQty, currentQty);
|
||||
const uint32 itemID = isRadiant ? RuleI(Zone, RadiantCrystalItemID) : RuleI(Zone, EbonCrystalItemID);
|
||||
|
||||
// Summon crystals for player.
|
||||
const bool success = SummonItem(itemID, amount);
|
||||
const uint32 amount = EQ::ClampUpper(quantity, current_quantity);
|
||||
const uint32 item_id = is_radiant ? RuleI(Zone, RadiantCrystalItemID) : RuleI(Zone, EbonCrystalItemID);
|
||||
|
||||
const bool success = SummonItem(item_id, amount);
|
||||
if (!success) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Deduct crystals from client and update them.
|
||||
if (isRadiant) {
|
||||
m_pp.currentRadCrystals -= amount;
|
||||
m_pp.careerRadCrystals -= amount;
|
||||
if (is_ebon) {
|
||||
RemoveEbonCrystals(amount, true);
|
||||
} else if (is_radiant) {
|
||||
RemoveRadiantCrystals(amount, true);
|
||||
}
|
||||
else if (isEbon) {
|
||||
m_pp.currentEbonCrystals -= amount;
|
||||
m_pp.careerEbonCrystals -= amount;
|
||||
}
|
||||
|
||||
SaveCurrency();
|
||||
SendCrystalCounts();
|
||||
}
|
||||
|
||||
void Client::Handle_OP_CrystalReclaim(const EQApplicationPacket *app)
|
||||
{
|
||||
uint32 ebon = NukeItem(RuleI(Zone, EbonCrystalItemID), invWhereWorn | invWherePersonal | invWhereCursor);
|
||||
uint32 radiant = NukeItem(RuleI(Zone, RadiantCrystalItemID), invWhereWorn | invWherePersonal | invWhereCursor);
|
||||
const uint32 ebon = NukeItem(RuleI(Zone, EbonCrystalItemID), invWhereWorn | invWherePersonal | invWhereCursor);
|
||||
const uint32 radiant = NukeItem(RuleI(Zone, RadiantCrystalItemID), invWhereWorn | invWherePersonal | invWhereCursor);
|
||||
if ((ebon + radiant) > 0) {
|
||||
AddCrystals(radiant, ebon);
|
||||
AddEbonCrystals(ebon, true);
|
||||
AddRadiantCrystals(radiant, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user