Files
WyvernMods/src/main/java/mod/sin/wyvern/bounty/PlayerBounty.java
2018-05-03 11:04:10 -04:00

221 lines
8.5 KiB
Java

package mod.sin.wyvern.bounty;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.logging.Logger;
import com.wurmonline.server.FailedException;
import com.wurmonline.server.Servers;
import com.wurmonline.server.creatures.Creature;
import com.wurmonline.server.economy.Economy;
import com.wurmonline.server.items.Item;
import com.wurmonline.server.items.ItemFactory;
import com.wurmonline.server.items.ItemTemplate;
import com.wurmonline.server.items.NoSuchTemplateException;
import com.wurmonline.server.players.Player;
import com.wurmonline.server.players.Titles.Title;
import com.wurmonline.server.skills.NoSuchSkillException;
import com.wurmonline.server.skills.SkillList;
import mod.sin.armour.SpectralHide;
import mod.sin.creatures.Reaper;
import mod.sin.creatures.SpectralDrake;
import mod.sin.items.AffinityOrb;
import mod.sin.items.caches.TitanCache;
import mod.sin.wyvern.Bounty;
import mod.sin.wyvern.Arena;
import mod.sin.wyvern.Titans;
import mod.sin.wyvern.util.ItemUtil;
public class PlayerBounty {
public static final Logger logger = Logger.getLogger(PlayerBounty.class.getName());
protected static final Random random = new Random();
public static HashMap<String, Long> steamIdMap = new HashMap<>();
public static HashMap<Long, ArrayList<Long>> playersRewarded = new HashMap<>();
public static double getTypeBountyMod(Creature mob, String mobType){
if(!mob.isUnique()){
if (mobType.endsWith("fierce ")){
return 1.5;
}else if (mobType.endsWith("angry ")){
return 1.4;
}else if (mobType.endsWith("raging ")){
return 1.6;
}else if (mobType.endsWith("slow ")){
return 0.95;
}else if (mobType.endsWith("alert ")){
return 1.2;
}else if (mobType.endsWith("greenish ")){
return 1.7;
}else if (mobType.endsWith("lurking ")){
return 1.1;
}else if (mobType.endsWith("sly ")){
return 0.8;
}else if (mobType.endsWith("hardened ")){
return 1.3;
}else if (mobType.endsWith("scared ")){
return 0.85;
}else if (mobType.endsWith("diseased ")){
return 0.9;
}else if (mobType.endsWith("champion ")){
return 2.0;
}
}
return 1.0;
}
public static void rewardPowerfulLoot(Player player, Creature mob){
try{
// Affinity Orb:
Item affinityOrb = ItemFactory.createItem(AffinityOrb.templateId, 99f+(1f*random.nextFloat()), "");
player.getInventory().insertItem(affinityOrb);
// Enchant Orb:
float power;
if(mob.getStatus().isChampion()){
power = 100f+(random.nextFloat()*20f);
}else{
power = 90f+(random.nextFloat()*30f);
}
Item enchantOrb = ItemUtil.createEnchantOrb(power);
player.getInventory().insertItem(enchantOrb);
player.getCommunicator().sendSafeServerMessage("Libila takes the "+mob.getNameWithoutPrefixes()+"'s soul, but leaves something else behind...");
}catch (NoSuchTemplateException | FailedException e) {
e.printStackTrace();
}
}
public static void rewardSpectralLoot(Player player){
try{
double fightskill = player.getFightingSkill().getKnowledge();
Item spectralHide = ItemFactory.createItem(SpectralHide.templateId, 70+(30*random.nextFloat()), ""); // Spectral Hide ID: 22764
ItemTemplate itemTemplate = spectralHide.getTemplate();
int weightGrams = itemTemplate.getWeightGrams();
spectralHide.setWeight((int)((weightGrams*0.25f)+(weightGrams*0.25f*fightskill/100f*random.nextFloat())), true);
player.getInventory().insertItem(spectralHide);
String fightStrength = "strong";
if(fightskill >= 60){
fightStrength = "great";
}
if(fightskill >= 70){
fightStrength = "powerful";
}
if(fightskill >= 80){
fightStrength = "master";
}
if(fightskill >= 90){
fightStrength = "legendary";
}
player.getCommunicator().sendSafeServerMessage("The spirit recognizes you as a "+fightStrength+" warrior, and rewards you accordingly.");
player.addTitle(Title.getTitle(701));
}catch (NoSuchTemplateException | FailedException e) {
e.printStackTrace();
}
}
public static void checkPlayerReward(Player player, Creature mob){
try{
if(mob.isReborn() || mob.isBred()){
return;
}
int mobTemplateId = mob.getTemplate().getTemplateId();
long mobWurmId = mob.getWurmId();
if(playersRewarded.containsKey(mobWurmId)){
ArrayList<Long> steamArray = playersRewarded.get(mobWurmId);
if(steamArray.contains(steamIdMap.get(player.getName()))){
player.getCommunicator().sendSafeServerMessage("Another character has claimed the reward from this bounty.");
return;
}
}
if(Bounty.dealtDamage.containsKey(mobWurmId) && Bounty.dealtDamage.get(mobWurmId).containsKey(player.getWurmId())){
// -- Damage Dealt Rewards -- //
/*if(mob.isUnique()){
// Treasure boxes awarded to players who deal damage:
Item treasureBox = ItemUtil.createTreasureBox();
if(treasureBox != null){
player.getInventory().insertItem(treasureBox);
}else{
logger.warning("Error: Treasure box was not created properly!");
}
}*/
if(Titans.isTitan(mob)){
player.addTitle(Title.getTitle(700));
Item affinityOrb = ItemFactory.createItem(AffinityOrb.templateId, 99f, mob.getName());
player.getInventory().insertItem(affinityOrb, true);
Item titanCache = ItemFactory.createItem(TitanCache.templateId, 99f, mob.getName());
player.getInventory().insertItem(titanCache, true);
return;
}
//double fightskill = player.getFightingSkill().getKnowledge();
/*if((mobTemplateId == Reaper.templateId || mobTemplateId == SpectralDrake.templateId) && fightskill >= 50){
rewardPowerfulLoot(player, mob); // Reward affinity orb and enchant orb:
if(mob.getTemplate().getTemplateId() == SpectralDrake.templateId){
rewardSpectralLoot(player); // Reward spectral hide for spectral drakes
}
return; // If the player receives powerful loot, break the method completely and skip bounty.
}*/
// -- End Damage Dealt Rewards -- //
}
String mobName = mob.getTemplate().getName().toLowerCase();
String mobType = mob.getPrefixes();
long iron;
double cretStr = Bounty.getCreatureStrength(mob);
if(Bounty.reward.containsKey(mobName)){
iron = Bounty.reward.get(mobName); // Prioritize hardcoded values in the Bounty.reward list first
}else{
iron = Math.round(cretStr); // Calculate bounty from creature strength if they do not exist in the reward list.
}
if(Servers.localServer.PVPSERVER){
if(!mob.isUnique() && mob.getTemplate().getTemplateId() != SpectralDrake.templateId && mob.getTemplate().getTemplateId() != Reaper.templateId){
iron *= 1.2d;
}
/*try {
player.getSkills().getSkill(SkillList.MEDITATING).skillCheck(10, 0, false, 1); // Meditation skill gain
float faithMod = 1-(player.getFaith()/200f);
player.modifyFaith((((float)cretStr)*faithMod)/200000f); // Faith skill gain
} catch (NoSuchSkillException e) {
e.printStackTrace();
}*/
}
// Multiply bounty based on type
//if(mob.isAggHuman() || mob.getBaseCombatRating() > 10) {
iron *= getTypeBountyMod(mob, mobType);
player.addMoney(iron);
Item inventory = player.getInventory();
String coinMessage = Economy.getEconomy().getChangeFor(iron).getChangeString();
String strBuilder = "You are awarded " + coinMessage;
strBuilder += " for slaying the " + mob.getName() + ".";
player.getCommunicator().sendSafeServerMessage(strBuilder);
long playerSteamId = steamIdMap.get(player.getName());
if(playersRewarded.containsKey(mobWurmId)){
playersRewarded.get(mobWurmId).add(playerSteamId);
}else{
ArrayList<Long> steamArray = new ArrayList<>();
steamArray.add(playerSteamId);
playersRewarded.put(mobWurmId, steamArray);
}
//}
}catch (IOException | FailedException | NoSuchTemplateException e) {
e.printStackTrace();
}
} // checkPlayerReward
public static void checkPlayerBounty(Player player, Creature creature){
try {
//Map<Long, Long> attackers = ReflectionUtil.getPrivateField(creature, ReflectionUtil.getField(creature.getClass(), "attackers"));
Map<Long, Long> attackers = Bounty.getAttackers(creature);
if(!Bounty.isCombatant(attackers, player.getWurmId()) || creature.isPlayer() || creature.isReborn()){
return;
}
logger.info(player.getName()+" killed "+creature.getName());
checkPlayerReward(player, creature);
} catch (IllegalArgumentException | ClassCastException e) {
e.printStackTrace();
}
}
}