bool TangibleObjectImplementation::canRepair(CreatureObject* player) { if (player == NULL || !isASubChildOf(player)) return false; SceneObject* inventory = player->getSlottedObject("inventory"); if (inventory == NULL) return false; for (int i = 0; i < inventory->getContainerObjectsSize(); ++i) { ManagedReference<SceneObject*> item = inventory->getContainerObject(i); if(item->isRepairTool()) { Reference<RepairToolTemplate*> repairTemplate = cast<RepairToolTemplate*>(item->getObjectTemplate()); if (repairTemplate == NULL) { error("No RepairToolTemplate for: " + String::valueOf(item->getServerObjectCRC())); continue; } if (repairTemplate->getRepairType() & getGameObjectType()) { return true; } } } return false; }
Reference<FactoryCrate*> TangibleObjectImplementation::createFactoryCrate(bool insertSelf) { String file; uint32 type = getGameObjectType(); if(type & SceneObjectType::ARMOR) file = "object/factory/factory_crate_armor.iff"; else if(type == SceneObjectType::CHEMICAL || type == SceneObjectType::PHARMACEUTICAL || type == SceneObjectType::PETMEDECINE) file = "object/factory/factory_crate_chemicals.iff"; else if(type & SceneObjectType::CLOTHING) file = "object/factory/factory_crate_clothing.iff"; else if(type == SceneObjectType::ELECTRONICS) file = "object/factory/factory_crate_electronics.iff"; else if(type == SceneObjectType::FOOD || type == SceneObjectType::DRINK) file = "object/factory/factory_crate_food.iff"; else if(type == SceneObjectType::FURNITURE) file = "object/factory/factory_crate_furniture.iff"; else if(type & SceneObjectType::INSTALLATION) file = "object/factory/factory_crate_installation.iff"; else if(type & SceneObjectType::WEAPON) file = "object/factory/factory_crate_weapon.iff"; else file = "object/factory/factory_crate_generic_items.iff"; ObjectManager* objectManager = ObjectManager::instance(); Reference<FactoryCrate*> crate = (getZoneServer()->createObject(file.hashCode(), 2)).castTo<FactoryCrate*>(); if (crate == NULL) return NULL; SharedTangibleObjectTemplate* tanoData = dynamic_cast<SharedTangibleObjectTemplate*>(templateObject.get()); if (tanoData == NULL) return NULL; crate->setMaxCapacity(tanoData->getFactoryCrateSize()); if (insertSelf) { crate->transferObject(_this.get(), -1, false); } else { ManagedReference<TangibleObject*> protoclone = cast<TangibleObject*>( objectManager->cloneObject(_this.get())); if (protoclone == NULL) return NULL; protoclone->setParent(NULL); crate->transferObject(protoclone, -1, false); } crate->setCustomObjectName(getCustomObjectName(), false); crate->setUseCount(1); return crate; }
void ContainerImplementation::notifyLoadFromDatabase() { TangibleObjectImplementation::notifyLoadFromDatabase(); if(getGameObjectType() == SceneObjectType::STATICLOOTCONTAINER) { if(System::random(100) < getLockChance()) { setLockedStatus(true); setSliceable(true); setSliced(false); } else { setLockedStatus(false); setSliceable(false); setSliced(false); } } }
String WeaponObjectImplementation::getWeaponType() { int weaponObjectType = getGameObjectType(); String weaponType; switch (weaponObjectType) { case SceneObjectType::ONEHANDMELEEWEAPON: weaponType = "onehandmelee"; break; case SceneObjectType::TWOHANDMELEEWEAPON: weaponType = "twohandmelee"; break; case SceneObjectType::WEAPON: case SceneObjectType::MELEEWEAPON: weaponType = "unarmed"; break; case SceneObjectType::RIFLE: weaponType = "rifle"; break; case SceneObjectType::PISTOL: weaponType = "pistol"; break; case SceneObjectType::CARBINE: weaponType = "carbine"; break; case SceneObjectType::POLEARM: weaponType = "polearm"; break; case SceneObjectType::THROWNWEAPON: weaponType = "thrownweapon"; break; case SceneObjectType::MINE: case SceneObjectType::SPECIALHEAVYWEAPON: case SceneObjectType::HEAVYWEAPON: weaponType = "heavyweapon"; break; default: weaponType = "unarmed"; break; } if (isJediOneHandedWeapon()) weaponType = "onehandlightsaber"; if (isJediTwoHandedWeapon()) weaponType = "twohandlightsaber"; if (isJediPolearmWeapon()) weaponType = "polearmlightsaber"; return weaponType; }
void TangibleObjectImplementation::repair(CreatureObject* player) { if(player == NULL || player->getZoneServer() == NULL) return; if(!isASubChildOf(player)) return; if (getConditionDamage() == 0) { player->sendSystemMessage("That item is not in need of repair."); return; } //Condition is unrepairable if ((getMaxCondition() - getConditionDamage()) <= 0) { StringIdChatParameter cantrepair("error_message", "sys_repair_unrepairable"); cantrepair.setTT(getDisplayedName()); player->sendSystemMessage(cantrepair); //%TT's condition is beyond repair even for your skills. return; } SceneObject* inventory = player->getSlottedObject("inventory"); if(inventory == NULL) return; ManagedReference<RepairTool*> repairTool = NULL; Reference<RepairToolTemplate*> repairTemplate = NULL; for(int i = 0; i < inventory->getContainerObjectsSize(); ++i) { ManagedReference<SceneObject*> item = inventory->getContainerObject(i); if(item->isRepairTool()) { repairTemplate = cast<RepairToolTemplate*>(item->getObjectTemplate()); if (repairTemplate == NULL) { error("No RepairToolTemplate for: " + String::valueOf(item->getServerObjectCRC())); return; } if(repairTemplate->getRepairType() & getGameObjectType()) { repairTool = cast<RepairTool*>(item.get()); break; } repairTemplate = NULL; } } if(repairTool == NULL) return; /// Luck Roll + Profession Mod(25) + Luck Tapes /// + Station Mod - BF /// Luck Roll int roll = System::random(100); int repairChance = roll; /// Profession Bonus if(player->hasSkill(repairTemplate->getSkill())) repairChance += 35; /// Get Skill mods repairChance += player->getSkillMod(repairTemplate->getSkillMod()); repairChance += player->getSkillMod("crafting_repair"); repairChance += player->getSkillMod("force_repair_bonus"); /// use tool quality to lower chances if bad tool float quality = 1.f - (((100.f - repairTool->getQuality()) / 2) / 100.f); repairChance *= quality; ManagedReference<PlayerManager*> playerMan = player->getZoneServer()->getPlayerManager(); /// Increase if near station if(playerMan->getNearbyCraftingStation(player, repairTemplate->getStationType()) != NULL) { repairChance += 15; } /// Subtract battle fatigue repairChance -= (player->getShockWounds() / 2); /// Subtract complexity repairChance -= (getComplexity() / 3); /// 5% random failure if(getMaxCondition() < 20 || roll < 5) repairChance = 0; if(roll > 95) repairChance = 100; String result = repairAttempt(repairChance); Locker locker(repairTool); repairTool->destroyObjectFromWorld(true); repairTool->destroyObjectFromDatabase(true); player->sendSystemMessage(result); }