mirror of
https://gitlab.com/Scribble/gdlenhanced.git
synced 2026-08-17 14:23:04 -04:00
654 lines
21 KiB
C++
654 lines
21 KiB
C++
|
|
#include <StdAfx.h>
|
|
#include "Gem.h"
|
|
#include "UseManager.h"
|
|
#include "Player.h"
|
|
#include "SpellcastingManager.h"
|
|
#include "World.h"
|
|
#include "WeenieFactory.h"
|
|
|
|
CGemWeenie::CGemWeenie()
|
|
{
|
|
}
|
|
|
|
CGemWeenie::~CGemWeenie()
|
|
{
|
|
}
|
|
|
|
int CGemWeenie::Use(CPlayerWeenie *player)
|
|
{
|
|
if (!player->FindContainedItem(GetID()))
|
|
{
|
|
player->NotifyUseDone(WERROR_NONE);
|
|
return WERROR_NONE;
|
|
}
|
|
|
|
if (player->IsInPortalSpace())
|
|
{
|
|
player->NotifyUseDone(WERROR_ACTIONS_LOCKED);
|
|
return WERROR_NONE;
|
|
}
|
|
|
|
if (InqDIDQuality(SPELL_DID, 0) && _nextUse > Timer::cur_time) // If this gem casts a spell and the _nextUse has not elapsed yet then cancel the use.
|
|
{
|
|
player->NotifyUseDone(WERROR_NONE);
|
|
player->SendText("You can't do that yet!", LTT_ERROR);
|
|
return WERROR_NONE;
|
|
}
|
|
|
|
if (InqBoolQuality(RARE_USES_TIMER_BOOL, 0) && player->_nextRareUse > Timer::cur_time) // If this is a rare gem and the _nextRareUse has not elapsed yet then cancel the use.
|
|
{
|
|
player->NotifyUseDone(WERROR_NONE);
|
|
player->SendText("You can't do that yet!", LTT_ERROR); // TODO: is this the correct text? Was it sent to your window? Did it notify you how much time you had left?
|
|
return WERROR_NONE;
|
|
}
|
|
|
|
CGenericUseEvent *useEvent = new CGenericUseEvent;
|
|
useEvent->_target_id = GetID();
|
|
player->ExecuteUseEvent(useEvent);
|
|
|
|
return WERROR_NONE;
|
|
}
|
|
|
|
int CGemWeenie::DoUseResponse(CWeenieObject *player)
|
|
{
|
|
if (InqIntQuality(ITEM_TYPE_INT, 0) == TYPE_FOOD)
|
|
{
|
|
player->DoForcedMotion(Motion_Eat);
|
|
player->DoForcedMotion(Motion_Ready);
|
|
}
|
|
|
|
if (uint32_t spell_did = InqDIDQuality(SPELL_DID, 0))
|
|
{
|
|
MakeSpellcastingManager()->CastSpellInstant(player->GetID(), spell_did);
|
|
|
|
// If this is a rare gem then set _nextRareUse on the player and broadcast the use locally, otherwise set the _nextUse on the gem.
|
|
if (InqBoolQuality(RARE_USES_TIMER_BOOL, 0))
|
|
{
|
|
player->AsPlayer()->_nextRareUse = Timer::cur_time + 180.0;
|
|
std::string text = csprintf("%s used the rare item %s", player->GetName().c_str(), GetName().c_str());
|
|
if (!text.empty())
|
|
{
|
|
g_pWorld->BroadcastLocal(player->GetLandcell(), text);
|
|
}
|
|
}
|
|
else
|
|
_nextUse = Timer::cur_time + InqFloatQuality(COOLDOWN_DURATION_FLOAT, 0, FALSE);
|
|
}
|
|
|
|
DecrementStackOrStructureNum();
|
|
|
|
return CWeenieObject::DoUseResponse(player);
|
|
}
|
|
|
|
|
|
//copied wholesale from manastone.cpp
|
|
int CGemWeenie::UseWith(CPlayerWeenie *player, CWeenieObject *with)
|
|
{
|
|
CGemUseEvent *useEvent = new CGemUseEvent;
|
|
useEvent->_target_id = with->GetID();
|
|
useEvent->_tool_id = GetID();
|
|
useEvent->_max_use_distance = 0.0;
|
|
player->ExecuteUseEvent(useEvent);
|
|
|
|
return WERROR_NONE;
|
|
}
|
|
|
|
//copied wholesale from manastone.cpp
|
|
void CGemUseEvent::OnReadyToUse()
|
|
{
|
|
|
|
CWeenieObject* target = GetTarget();
|
|
if (!target && _target_id)
|
|
{
|
|
Cancel(WERROR_OBJECT_GONE);
|
|
return;
|
|
}
|
|
|
|
CWeenieObject *tool = GetTool();
|
|
if (!tool && _tool_id)
|
|
{
|
|
Cancel(WERROR_OBJECT_GONE);
|
|
return;
|
|
}
|
|
|
|
int error = WERROR_NONE;
|
|
|
|
if (target)
|
|
{
|
|
error = tool->DoUseWithResponse(_weenie, target);
|
|
}
|
|
|
|
Done(error);
|
|
}
|
|
|
|
int CGemWeenie::DoUseWithResponse(CWeenieObject* source, CWeenieObject* pTarget)
|
|
{
|
|
switch (m_Qualities.id)
|
|
{
|
|
case 42622://Armor Main Reduction Tool
|
|
case 44879://Armor Lower Reduction Tool
|
|
case 44880://Armor Middle Reduction Tool
|
|
{
|
|
return Tailor_ReduceArmor(source, pTarget);
|
|
}
|
|
|
|
case 41956://Armor Tailoring Kit
|
|
{
|
|
return Tailor_KitOntoArmor(source, pTarget);
|
|
}
|
|
|
|
case 51445://Weapon Tailoring Kit
|
|
{
|
|
return Tailor_KitOntoWeapon(source, pTarget);
|
|
}
|
|
|
|
case 42724://Armor Layering Tool(Top)
|
|
{
|
|
return Tailor_LayerTop(source, pTarget);
|
|
}
|
|
|
|
case 42726://Armor Layering Tool(Bottom)
|
|
{
|
|
return Tailor_LayerBot(source, pTarget);
|
|
}
|
|
|
|
//tked armor intermediaries
|
|
case 42414://helm
|
|
case 42407://gauntlets
|
|
case 42422://boots
|
|
case 42403://breastplate
|
|
case 42409://girth
|
|
case 42418://pauldrons
|
|
case 42421://vambraces
|
|
case 42411://tassets
|
|
case 42416://greaves
|
|
case 42417://lower-body multislot
|
|
case 42405://upper-body multislot
|
|
case 44863://clothing or shield
|
|
{
|
|
return Tailor_TempOntoArmor(source, pTarget);
|
|
}
|
|
|
|
case 51451://tked weapon
|
|
{
|
|
return Tailor_TempOntoWeapon(source, pTarget);
|
|
}
|
|
default:
|
|
{
|
|
//return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
return CWeenieObject::DoUseWithResponse(source, pTarget);
|
|
}
|
|
}
|
|
|
|
//return WERROR_NONE;
|
|
}
|
|
|
|
int CGemWeenie::Tailor_ReduceArmor(CWeenieObject* source, CWeenieObject* pTarget)
|
|
{
|
|
//if retained item->bail
|
|
if (pTarget->m_Qualities.GetBool(RETAINED_BOOL, bool())) return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
|
|
if (!source->FindContainedItem(pTarget->id)) return WERROR_ILLEGAL_INVENTORY_TRANSACTION;
|
|
if (pTarget->IsEquipped()) return WERROR_ILLEGAL_INVENTORY_TRANSACTION;
|
|
|
|
//quest item->bail
|
|
if (!pTarget->m_Qualities.GetInt(ITEM_WORKMANSHIP_INT, int())) return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
|
|
int locations = pTarget->m_Qualities.GetInt(LOCATIONS_INT, int());
|
|
int priorities = 0;
|
|
|
|
switch (m_Qualities.id)
|
|
{
|
|
case 42622://Armor Main Reduction Tool
|
|
{
|
|
//coat->bp //shirt->bp //cuirass->bp
|
|
if (locations == CHEST_UPPERARM_LOWERARM_LOC || locations == CHEST_UPPERARM_LOWERARM_ABS_LOC || locations == CHEST_ABS_LOC
|
|
|| locations == CHEST_UPPERARM_ABS_LOC || locations == CHEST_UPPERARM_LOC)
|
|
{
|
|
locations = CHEST_ARMOR_LOC;
|
|
priorities = CHEST_ARMOR_CLOTHING_PRIORITY;
|
|
}
|
|
//sleeves->paulds
|
|
else if (locations == UPPERARM_LOWERARM_LOC)
|
|
{
|
|
locations = UPPER_ARM_ARMOR_LOC;
|
|
priorities = UPPER_ARM_ARMOR_CLOTHING_PRIORITY;
|
|
}
|
|
//legs->girth // shorts->girth
|
|
else if (locations == ABS_UPPERLEG_LOWERLEG_LOC || locations == ABS_UPPERLEG_LOC)
|
|
{
|
|
locations = ABDOMEN_ARMOR_LOC;
|
|
priorities = ABDOMEN_ARMOR_CLOTHING_PRIORITY;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 44879://Armor Lower Reduction Tool
|
|
{
|
|
//sleeves->bracers
|
|
if (locations == UPPERARM_LOWERARM_LOC)
|
|
{
|
|
locations = LOWER_ARM_ARMOR_LOC;
|
|
priorities = LOWER_ARM_ARMOR_CLOTHING_PRIORITY;
|
|
}
|
|
//legs->greaves //chaps->greaves
|
|
else if (locations == ABS_UPPERLEG_LOWERLEG_LOC || locations == UPPERLEG_LOWERLEG_LOC)
|
|
{
|
|
locations = LOWER_LEG_ARMOR_LOC;
|
|
priorities = LOWER_LEG_ARMOR_CLOTHING_PRIORITY;
|
|
}
|
|
// Viamontian Laced Boots -> boots
|
|
else if (locations == LOWERLEG_FOOT_LOC)
|
|
{
|
|
locations = FOOT_WEAR_LOC;
|
|
priorities = FOOT_WEAR_CLOTHING_PRIORITY;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case 44880://Armor Middle Reduction Tool
|
|
{
|
|
//legs->tassets //chaps->tassets //shorts->tassets
|
|
if (locations == ABS_UPPERLEG_LOWERLEG_LOC || locations == UPPERLEG_LOWERLEG_LOC || locations == ABS_UPPERLEG_LOC)
|
|
{
|
|
locations = UPPER_LEG_ARMOR_LOC;
|
|
priorities = UPPER_LEG_ARMOR_CLOTHING_PRIORITY;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
//no successful reduction
|
|
if (priorities == 0) return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
|
|
//successful reduction
|
|
pTarget->m_Qualities.SetInt(LOCATIONS_INT, locations);
|
|
pTarget->NotifyIntStatUpdated(LOCATIONS_INT, false);
|
|
pTarget->m_Qualities.SetInt(CLOTHING_PRIORITY_INT, priorities);
|
|
pTarget->NotifyIntStatUpdated(CLOTHING_PRIORITY_INT, false);
|
|
|
|
//remove kit
|
|
Remove();
|
|
|
|
return WERROR_NONE;
|
|
}
|
|
|
|
int CGemWeenie::Tailor_KitOntoArmor(CWeenieObject* source, CWeenieObject* pTarget)
|
|
{
|
|
if (pTarget->m_Qualities.GetBool(RETAINED_BOOL, false))
|
|
{
|
|
source->AsPlayer()->SendText("You must use Sandstone Salvage to remove the retained property before tailoring.", LTT_CRAFT);
|
|
return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
}
|
|
|
|
if (!source->FindContainedItem(pTarget->id)) return WERROR_ILLEGAL_INVENTORY_TRANSACTION;
|
|
if (pTarget->IsEquipped()) return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
|
|
int locations = pTarget->m_Qualities.GetInt(LOCATIONS_INT, int());
|
|
CWeenieObject* weenie = NULL;
|
|
|
|
switch (locations)
|
|
{
|
|
case HEAD_WEAR_LOC: //42414
|
|
{
|
|
weenie = g_pWeenieFactory->CreateWeenieByClassID(42414, NULL);
|
|
break;
|
|
}
|
|
case HAND_WEAR_LOC: //42407
|
|
{
|
|
weenie = g_pWeenieFactory->CreateWeenieByClassID(42407, NULL);
|
|
break;
|
|
}
|
|
case FOOT_LOWERLEG_BOOTS_LOC: // Stupid boots...
|
|
case FOOT_WEAR_LOC: //42422
|
|
{
|
|
weenie = g_pWeenieFactory->CreateWeenieByClassID(42422, NULL);
|
|
break;
|
|
}
|
|
case CHEST_ARMOR_LOC: //42403
|
|
{
|
|
weenie = g_pWeenieFactory->CreateWeenieByClassID(42403, NULL);
|
|
break;
|
|
}
|
|
case ABDOMEN_ARMOR_LOC: //42409
|
|
{
|
|
weenie = g_pWeenieFactory->CreateWeenieByClassID(42409, NULL);
|
|
break;
|
|
}
|
|
case UPPER_ARM_ARMOR_LOC: //42418
|
|
{
|
|
weenie = g_pWeenieFactory->CreateWeenieByClassID(42418, NULL);
|
|
break;
|
|
}
|
|
case LOWER_ARM_ARMOR_LOC: //42421
|
|
{
|
|
weenie = g_pWeenieFactory->CreateWeenieByClassID(42421, NULL);
|
|
break;
|
|
}
|
|
case UPPER_LEG_ARMOR_LOC: //42411
|
|
{
|
|
weenie = g_pWeenieFactory->CreateWeenieByClassID(42411, NULL);
|
|
break;
|
|
}
|
|
case LOWER_LEG_ARMOR_LOC: //42416
|
|
{
|
|
weenie = g_pWeenieFactory->CreateWeenieByClassID(42416, NULL);
|
|
break;
|
|
}
|
|
|
|
case 6656: //SHORT_COAT_ARMOR_LOC //42405
|
|
case 1536: //CUIRASS_ARMOR_LOC
|
|
case 7680: //LONG_COAT_ARMOR_LOC
|
|
case 3584: //LONG_SHIRT_ARMOR_LOC
|
|
case 2560: //SHORT_SHIRT_ARMOR_LOC
|
|
case 6144: //SLEEVES_ARMOR_LOC
|
|
{
|
|
weenie = g_pWeenieFactory->CreateWeenieByClassID(42405, NULL);
|
|
break;
|
|
}
|
|
|
|
case 25600: //LEGGINGS_ARMOR_LOC //42417
|
|
case 24576: //CHAPS_ARMOR_LOC
|
|
case 9216: //SHORTS_ARMOR_SLOT
|
|
{
|
|
weenie = g_pWeenieFactory->CreateWeenieByClassID(42417, NULL);
|
|
break;
|
|
}
|
|
|
|
case CLOAK_LOC: //44863
|
|
case SHIELD_LOC:
|
|
case 32512: //ROBE_ARMOR_SLOT
|
|
case 32513: //HOODED_ROBE_ARMOR_SLOT
|
|
case 26: //FC_UPPER_UNDIES_SLOT
|
|
case 196: //FC_LOWER_UNDIES_SLOT
|
|
case 222: //FC_RAIMENT_UNDIES_SLOT
|
|
{
|
|
weenie = g_pWeenieFactory->CreateWeenieByClassID(44863, NULL);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
}
|
|
}
|
|
|
|
weenie->m_Qualities.SetString(NAME_STRING, pTarget->m_Qualities.GetString(NAME_STRING, std::string()));
|
|
|
|
weenie->m_Qualities.SetInt(PALETTE_TEMPLATE_INT, pTarget->m_Qualities.GetInt(PALETTE_TEMPLATE_INT, int()));
|
|
weenie->m_Qualities.SetInt(CLOTHING_PRIORITY_INT, pTarget->m_Qualities.GetInt(CLOTHING_PRIORITY_INT, int()));
|
|
weenie->m_Qualities.SetInt(ENCUMB_VAL_INT, pTarget->m_Qualities.GetInt(ENCUMB_VAL_INT, int()));
|
|
weenie->m_Qualities.SetInt(UI_EFFECTS_INT, pTarget->m_Qualities.GetInt(UI_EFFECTS_INT, int()));
|
|
weenie->m_Qualities.SetInt(VALUE_INT, pTarget->m_Qualities.GetInt(VALUE_INT, int()));
|
|
weenie->m_Qualities.SetInt(MATERIAL_TYPE_INT, pTarget->m_Qualities.GetInt(MATERIAL_TYPE_INT, int()));
|
|
weenie->m_Qualities.SetInt(TARGET_TYPE_INT, pTarget->m_Qualities.GetInt(ITEM_TYPE_INT, int()));
|
|
|
|
double shade = 0;
|
|
if (pTarget->m_Qualities.InqFloat(SHADE_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE_FLOAT, shade);
|
|
if (pTarget->m_Qualities.InqFloat(SHADE2_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE2_FLOAT, shade);
|
|
if (pTarget->m_Qualities.InqFloat(SHADE3_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE3_FLOAT, shade);
|
|
if (pTarget->m_Qualities.InqFloat(SHADE4_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE4_FLOAT, shade);
|
|
|
|
weenie->m_Qualities.SetDataID(SETUP_DID, pTarget->m_Qualities.GetDID(SETUP_DID, uint32_t()));
|
|
weenie->m_Qualities.SetDataID(PALETTE_BASE_DID, pTarget->m_Qualities.GetDID(PALETTE_BASE_DID, uint32_t()));
|
|
weenie->m_Qualities.SetDataID(CLOTHINGBASE_DID, pTarget->m_Qualities.GetDID(CLOTHINGBASE_DID, uint32_t()));
|
|
weenie->m_Qualities.SetDataID(ICON_DID, pTarget->m_Qualities.GetDID(ICON_DID, uint32_t()));
|
|
|
|
weenie->m_ObjDescOverride.Clear();
|
|
|
|
DecrementStackOrStructureNum();
|
|
pTarget->Remove();
|
|
|
|
source->AsPlayer()->SpawnInContainer(weenie);
|
|
return WERROR_NONE;
|
|
}
|
|
|
|
int CGemWeenie::Tailor_KitOntoWeapon(CWeenieObject* source, CWeenieObject* pTarget)
|
|
{
|
|
if (!source->FindContainedItem(pTarget->id)) return WERROR_ILLEGAL_INVENTORY_TRANSACTION;
|
|
if (pTarget->IsEquipped()) return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
|
|
if (pTarget->m_Qualities.GetBool(RETAINED_BOOL, false))
|
|
{
|
|
source->AsPlayer()->SendText("You must use Sandstone Salvage to remove the retained property before tailoring.", LTT_CRAFT);
|
|
return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
}
|
|
|
|
//no fucking goblets lime godamnit
|
|
if (pTarget->m_Qualities.GetInt(ITEM_TYPE_INT, int()) == TYPE_MISSILE_WEAPON
|
|
&& pTarget->m_Qualities.GetInt(DEFAULT_COMBAT_STYLE_INT, int()) == ThrownWeapon_CombatStyle) return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
|
|
CWeenieObject* weenie = NULL;
|
|
|
|
weenie = g_pWeenieFactory->CreateWeenieByClassID(51451, NULL);
|
|
|
|
weenie->m_Qualities.SetString(NAME_STRING, pTarget->m_Qualities.GetString(NAME_STRING, std::string()));
|
|
|
|
switch (pTarget->m_Qualities.GetInt(ITEM_TYPE_INT, int()))
|
|
{
|
|
case TYPE_MELEE_WEAPON:
|
|
{
|
|
weenie->m_Qualities.SetInt(TARGET_TYPE_INT, TYPE_MELEE_WEAPON);
|
|
weenie->m_Qualities.SetInt(WEAPON_TYPE_INT, pTarget->m_Qualities.GetInt(WEAPON_TYPE_INT, int()));
|
|
break;
|
|
}
|
|
case TYPE_MISSILE_WEAPON:
|
|
{
|
|
weenie->m_Qualities.SetInt(TARGET_TYPE_INT, TYPE_MISSILE_WEAPON);
|
|
weenie->m_Qualities.SetInt(DEFAULT_COMBAT_STYLE_INT, pTarget->m_Qualities.GetInt(DEFAULT_COMBAT_STYLE_INT, int()));
|
|
break;
|
|
}
|
|
case TYPE_CASTER:
|
|
{
|
|
weenie->m_Qualities.SetInt(TARGET_TYPE_INT, TYPE_CASTER);
|
|
break;
|
|
}
|
|
}
|
|
|
|
weenie->m_Qualities.SetInt(PALETTE_TEMPLATE_INT, pTarget->m_Qualities.GetInt(PALETTE_TEMPLATE_INT, int()));
|
|
weenie->m_Qualities.SetInt(ENCUMB_VAL_INT, pTarget->m_Qualities.GetInt(ENCUMB_VAL_INT, int()));
|
|
weenie->m_Qualities.SetInt(UI_EFFECTS_INT, pTarget->m_Qualities.GetInt(UI_EFFECTS_INT, int()));
|
|
weenie->m_Qualities.SetInt(VALUE_INT, pTarget->m_Qualities.GetInt(VALUE_INT, int()));
|
|
weenie->m_Qualities.SetInt(DAMAGE_TYPE_INT, pTarget->m_Qualities.GetInt(DAMAGE_TYPE_INT, int()));
|
|
weenie->m_Qualities.SetInt(MATERIAL_TYPE_INT, pTarget->m_Qualities.GetInt(MATERIAL_TYPE_INT, int()));
|
|
|
|
double shade = 0;
|
|
if (pTarget->m_Qualities.InqFloat(SHADE_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE_FLOAT, shade);
|
|
if (pTarget->m_Qualities.InqFloat(SHADE2_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE2_FLOAT, shade);
|
|
if (pTarget->m_Qualities.InqFloat(SHADE3_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE3_FLOAT, shade);
|
|
if (pTarget->m_Qualities.InqFloat(SHADE4_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE4_FLOAT, shade);
|
|
|
|
weenie->m_Qualities.SetFloat(DEFAULT_SCALE_FLOAT, pTarget->m_Qualities.GetFloat(DEFAULT_SCALE_FLOAT, float()));
|
|
|
|
weenie->m_Qualities.SetDataID(SETUP_DID, pTarget->m_Qualities.GetDID(SETUP_DID, uint32_t()));
|
|
weenie->m_Qualities.SetDataID(PALETTE_BASE_DID, pTarget->m_Qualities.GetDID(PALETTE_BASE_DID, uint32_t()));
|
|
weenie->m_Qualities.SetDataID(CLOTHINGBASE_DID, pTarget->m_Qualities.GetDID(CLOTHINGBASE_DID, uint32_t()));
|
|
weenie->m_Qualities.SetDataID(ICON_DID, pTarget->m_Qualities.GetDID(ICON_DID, uint32_t()));
|
|
|
|
DecrementStackOrStructureNum();
|
|
pTarget->Remove();
|
|
|
|
source->AsPlayer()->SpawnInContainer(weenie);
|
|
return WERROR_NONE;
|
|
}
|
|
|
|
int CGemWeenie::Tailor_TempOntoArmor(CWeenieObject* source, CWeenieObject* pTarget)
|
|
{
|
|
//if retained item->bail
|
|
if (pTarget->m_Qualities.GetBool(RETAINED_BOOL, false))
|
|
{
|
|
source->AsPlayer()->SendText("You must use Sandstone Salvage to remove the retained property before tailoring.", LTT_CRAFT);
|
|
return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
}
|
|
|
|
if (!source->FindContainedItem(pTarget->id)) return WERROR_ILLEGAL_INVENTORY_TRANSACTION;
|
|
if (pTarget->IsEquipped())
|
|
{
|
|
source->AsPlayer()->SendText("You must unequip this armor before tailoring.", LTT_CRAFT);
|
|
return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
}
|
|
|
|
int shieldLoc = pTarget->m_Qualities.GetInt(LOCATIONS_INT, 0);
|
|
//wrong coverage->bail
|
|
if (m_Qualities.GetInt(CLOTHING_PRIORITY_INT, int()) != pTarget->m_Qualities.GetInt(CLOTHING_PRIORITY_INT, int()) && shieldLoc != 2097152) return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
|
|
CWeenieObject* weenie = g_pWeenieFactory->CloneWeenie(pTarget);
|
|
|
|
weenie->m_Qualities.SetString(NAME_STRING, m_Qualities.GetString(NAME_STRING, std::string()));
|
|
|
|
weenie->m_Qualities.SetInt(PALETTE_TEMPLATE_INT, m_Qualities.GetInt(PALETTE_TEMPLATE_INT, int()));
|
|
weenie->m_Qualities.SetInt(UI_EFFECTS_INT, m_Qualities.GetInt(UI_EFFECTS_INT, int()));
|
|
weenie->m_Qualities.SetInt(MATERIAL_TYPE_INT, m_Qualities.GetInt(MATERIAL_TYPE_INT, int()));
|
|
|
|
double shade = 0;
|
|
if (m_Qualities.InqFloat(SHADE_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE_FLOAT, shade);
|
|
if (m_Qualities.InqFloat(SHADE2_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE2_FLOAT, shade);
|
|
if (m_Qualities.InqFloat(SHADE3_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE3_FLOAT, shade);
|
|
if (m_Qualities.InqFloat(SHADE4_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE4_FLOAT, shade);
|
|
|
|
weenie->m_Qualities.SetDataID(SETUP_DID, m_Qualities.GetDID(SETUP_DID, uint32_t()));
|
|
weenie->m_Qualities.SetDataID(PALETTE_BASE_DID, m_Qualities.GetDID(PALETTE_BASE_DID, uint32_t()));
|
|
weenie->m_Qualities.SetDataID(CLOTHINGBASE_DID, m_Qualities.GetDID(CLOTHINGBASE_DID, uint32_t()));
|
|
weenie->m_Qualities.SetDataID(ICON_DID, m_Qualities.GetDID(ICON_DID, uint32_t()));
|
|
|
|
weenie->m_ObjDescOverride.Clear();
|
|
|
|
pTarget->Remove();
|
|
Remove();
|
|
|
|
source->AsPlayer()->SpawnInContainer(weenie);
|
|
|
|
return WERROR_NONE;
|
|
}
|
|
|
|
int CGemWeenie::Tailor_TempOntoWeapon(CWeenieObject* source, CWeenieObject* pTarget)
|
|
{
|
|
//if retained item->bail
|
|
if (pTarget->m_Qualities.GetBool(RETAINED_BOOL, bool()))
|
|
{
|
|
source->AsPlayer()->SendText("You must use Sandstone Salvage to remove the retained property before tailoring.", LTT_CRAFT);
|
|
return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
}
|
|
|
|
if (!source->FindContainedItem(pTarget->id)) return WERROR_ILLEGAL_INVENTORY_TRANSACTION;
|
|
if (pTarget->IsEquipped())
|
|
{
|
|
source->AsPlayer()->SendText("You must unequip this weapon before tailoring.", LTT_CRAFT);
|
|
return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
}
|
|
|
|
switch (m_Qualities.GetInt(TARGET_TYPE_INT, int()))
|
|
{
|
|
case TYPE_MELEE_WEAPON:
|
|
{
|
|
//if weap type mismatch->bail
|
|
if (m_Qualities.GetInt(WEAPON_TYPE_INT, int()) != pTarget->m_Qualities.GetInt(WEAPON_TYPE_INT, int()))
|
|
{
|
|
source->AsPlayer()->SendText("Weapon types do not match.", LTT_CRAFT);
|
|
return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
}
|
|
|
|
//if ele mismatch->bail
|
|
if (m_Qualities.GetInt(DAMAGE_TYPE_INT, int()) != pTarget->m_Qualities.GetInt(DAMAGE_TYPE_INT, int()))
|
|
{
|
|
source->AsPlayer()->SendText("Damage types do not match.", LTT_CRAFT);
|
|
return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case TYPE_MISSILE_WEAPON:
|
|
{
|
|
//if weap type mismatch->bail (MISSILE WEAPONS ARE WEIRD)
|
|
if (m_Qualities.GetInt(DEFAULT_COMBAT_STYLE_INT, int()) != pTarget->m_Qualities.GetInt(DEFAULT_COMBAT_STYLE_INT, int()))
|
|
{
|
|
source->AsPlayer()->SendText("Weapon types do not match.", LTT_CRAFT);
|
|
return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
}
|
|
|
|
//if ele mismatch->bail (allow neutral to overwrite ele)
|
|
if (m_Qualities.GetInt(DAMAGE_TYPE_INT, int()) != 0
|
|
&& m_Qualities.GetInt(DAMAGE_TYPE_INT, int()) != pTarget->m_Qualities.GetInt(DAMAGE_TYPE_INT, int()))
|
|
{
|
|
source->AsPlayer()->SendText("Damage types do not match.", LTT_CRAFT);
|
|
return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case TYPE_CASTER:
|
|
{
|
|
//if ele mismatch->bail (allow neutral to overwrite ele)
|
|
if (m_Qualities.GetInt(DAMAGE_TYPE_INT, int()) != 0
|
|
&& m_Qualities.GetInt(DAMAGE_TYPE_INT, int()) != pTarget->m_Qualities.GetInt(DAMAGE_TYPE_INT, int()))
|
|
{
|
|
source->AsPlayer()->SendText("Damage types do not match.", LTT_CRAFT);
|
|
return WERROR_CRAFT_FAILED_REQUIREMENTS;
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
CWeenieObject* weenie = g_pWeenieFactory->CloneWeenie(pTarget);
|
|
|
|
weenie->m_Qualities.SetString(NAME_STRING, m_Qualities.GetString(NAME_STRING, std::string()));
|
|
|
|
weenie->m_Qualities.SetInt(PALETTE_TEMPLATE_INT, m_Qualities.GetInt(PALETTE_TEMPLATE_INT, int()));
|
|
weenie->m_Qualities.SetInt(UI_EFFECTS_INT, m_Qualities.GetInt(UI_EFFECTS_INT, int()));
|
|
weenie->m_Qualities.SetInt(MATERIAL_TYPE_INT, m_Qualities.GetInt(MATERIAL_TYPE_INT, int()));
|
|
|
|
double shade = 0;
|
|
if (m_Qualities.InqFloat(SHADE_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE_FLOAT, shade);
|
|
if (m_Qualities.InqFloat(SHADE2_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE2_FLOAT, shade);
|
|
if (m_Qualities.InqFloat(SHADE3_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE3_FLOAT, shade);
|
|
if (m_Qualities.InqFloat(SHADE4_FLOAT, shade, TRUE))
|
|
weenie->m_Qualities.SetFloat(SHADE4_FLOAT, shade);
|
|
|
|
weenie->m_Qualities.SetFloat(DEFAULT_SCALE_FLOAT, m_Qualities.GetFloat(DEFAULT_SCALE_FLOAT, float()));
|
|
|
|
weenie->m_Qualities.SetDataID(SETUP_DID, m_Qualities.GetDID(SETUP_DID, uint32_t()));
|
|
weenie->m_Qualities.SetDataID(PALETTE_BASE_DID, m_Qualities.GetDID(PALETTE_BASE_DID, uint32_t()));
|
|
weenie->m_Qualities.SetDataID(CLOTHINGBASE_DID, m_Qualities.GetDID(CLOTHINGBASE_DID, uint32_t()));
|
|
weenie->m_Qualities.SetDataID(ICON_DID, m_Qualities.GetDID(ICON_DID, uint32_t()));
|
|
|
|
pTarget->Remove();
|
|
Remove();
|
|
|
|
source->AsPlayer()->SpawnInContainer(weenie);
|
|
return WERROR_NONE;
|
|
}
|
|
|
|
int CGemWeenie::Tailor_LayerTop(CWeenieObject* source, CWeenieObject* pTarget)
|
|
{
|
|
pTarget->m_Qualities.SetBool(TOP_LAYER_PRIORITY_BOOL, 1);
|
|
pTarget->NotifyBoolStatUpdated(TOP_LAYER_PRIORITY_BOOL);
|
|
DecrementStackOrStructureNum();
|
|
source->SendText("You modify your armor", LogTextType::LTT_CRAFT);
|
|
return WERROR_NONE;
|
|
}
|
|
|
|
int CGemWeenie::Tailor_LayerBot(CWeenieObject* source, CWeenieObject* pTarget)
|
|
{
|
|
pTarget->m_Qualities.SetBool(TOP_LAYER_PRIORITY_BOOL, 0);
|
|
pTarget->NotifyBoolStatUpdated(TOP_LAYER_PRIORITY_BOOL);
|
|
DecrementStackOrStructureNum();
|
|
source->SendText("You modify your armor", LogTextType::LTT_CRAFT);
|
|
return WERROR_NONE;
|
|
}
|
|
|