Summon amount limits and new ability

This commit is contained in:
TfT_02
2013-09-17 00:55:38 +02:00
parent eda38cba66
commit c31281971c
13 changed files with 111 additions and 33 deletions

View File

@ -1,12 +1,8 @@
package com.gmail.nossr50.skills.taming;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.EntityEffect;
import org.bukkit.entity.AnimalTamer;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import org.bukkit.entity.Wolf;
@ -16,8 +12,6 @@ import com.gmail.nossr50.config.experience.ExperienceConfig;
import com.gmail.nossr50.locale.LocaleLoader;
public class Taming {
private static List<TrackedTamingEntity> trackedEntities = new ArrayList<TrackedTamingEntity>();
public static int environmentallyAwareUnlockLevel = AdvancedConfig.getInstance().getEnviromentallyAwareUnlock();
public static int holyHoundUnlockLevel = AdvancedConfig.getInstance().getHolyHoundUnlock();
@ -81,14 +75,4 @@ public class Taming {
return "";
}
}
protected static void addToTracker(LivingEntity livingEntity) {
TrackedTamingEntity trackedEntity = new TrackedTamingEntity(livingEntity);
trackedEntities.add(trackedEntity);
}
protected static void removeFromTracker(TrackedTamingEntity trackedEntity) {
trackedEntities.remove(trackedEntity);
}
}

View File

@ -1,5 +1,9 @@
package com.gmail.nossr50.skills.taming;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.bukkit.Location;
import org.bukkit.Sound;
import org.bukkit.entity.Entity;
@ -20,12 +24,14 @@ import com.gmail.nossr50.datatypes.skills.SecondaryAbility;
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.datatypes.skills.XPGainReason;
import com.gmail.nossr50.events.fake.FakeEntityTameEvent;
import com.gmail.nossr50.events.skills.secondaryabilities.SecondaryAbilityWeightedActivationCheckEvent;
import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.runnables.skills.BleedTimerTask;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.StringUtils;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.ParticleEffectUtils;
import com.gmail.nossr50.util.skills.SkillUtils;
@ -34,6 +40,8 @@ public class TamingManager extends SkillManager {
super(mcMMOPlayer, SkillType.TAMING);
}
private static HashMap<EntityType, List<TrackedTamingEntity>> summonedEntities = new HashMap<EntityType, List<TrackedTamingEntity>>();
public boolean canUseThickFur() {
return getSkillLevel() >= Taming.thickFurUnlockLevel && Permissions.secondaryAbilityEnabled(getPlayer(), SecondaryAbility.THICK_FUR);
}
@ -200,6 +208,26 @@ public class TamingManager extends SkillManager {
owner.sendMessage(LocaleLoader.getString("Taming.Listener.Wolf"));
}
public void pummel(LivingEntity target, Wolf wolf) {
double chance = 10 / activationChance;
SecondaryAbilityWeightedActivationCheckEvent event = new SecondaryAbilityWeightedActivationCheckEvent(getPlayer(), SecondaryAbility.PUMMEL, chance);
mcMMO.p.getServer().getPluginManager().callEvent(event);
if ((event.getChance() * activationChance) <= Misc.getRandom().nextInt(activationChance)) {
return;
}
ParticleEffectUtils.playGreaterImpactEffect(target);
target.setVelocity(wolf.getLocation().getDirection().normalize().multiply(1.5D));
if (target instanceof Player) {
Player defender = (Player) target;
if (UserManager.getPlayer(defender).useChatNotifications()) {
defender.sendMessage("Wolf pummeled at you");
}
}
}
/**
* Handle the Call of the Wild ability.
*
@ -226,6 +254,10 @@ public class TamingManager extends SkillManager {
int tamingCOTWLength = Config.getInstance().getTamingCOTWLength(type);
for (int i = 0; i < amount; i++) {
if (!summonAmountCheck(type)) {
return;
}
LivingEntity entity = (LivingEntity) player.getWorld().spawnEntity(location, type);
FakeEntityTameEvent event = new FakeEntityTameEvent(entity, player);
@ -239,9 +271,7 @@ public class TamingManager extends SkillManager {
((Tameable) entity).setOwner(player);
entity.setRemoveWhenFarAway(false);
if (tamingCOTWLength > 0) {
Taming.addToTracker(entity);
}
addToTracker(entity);
switch (type) {
case OCELOT:
@ -270,7 +300,6 @@ public class TamingManager extends SkillManager {
if (Permissions.renamePets(player)) {
entity.setCustomName(LocaleLoader.getString("Taming.Summon.Name.Format", player.getName(), StringUtils.getPrettyEntityTypeString(type)));
entity.setCustomNameVisible(true);
}
ParticleEffectUtils.playCallOfTheWildEffect(entity);
@ -304,4 +333,37 @@ public class TamingManager extends SkillManager {
return true;
}
private boolean summonAmountCheck(EntityType entityType) {
Player player = getPlayer();
int maxAmountSummons = Config.getInstance().getTamingCOTWMaxAmount(entityType);
if (maxAmountSummons <= 0) {
return true;
}
int summonAmount = summonedEntities.get(entityType).size();
if (summonAmount >= maxAmountSummons) {
player.sendMessage(LocaleLoader.getString("Taming.Summon.Fail.TooMany", maxAmountSummons));
return false;
}
return true;
}
protected static void addToTracker(LivingEntity livingEntity) {
TrackedTamingEntity trackedEntity = new TrackedTamingEntity(livingEntity);
if (!summonedEntities.containsKey(livingEntity.getType())) {
summonedEntities.put(livingEntity.getType(), new ArrayList<TrackedTamingEntity>());
}
summonedEntities.get(livingEntity.getType()).add(trackedEntity);
}
protected static void removeFromTracker(TrackedTamingEntity trackedEntity) {
summonedEntities.get(trackedEntity.getLivingEntity().getType()).remove(trackedEntity);
}
}

View File

@ -4,30 +4,43 @@ import java.util.UUID;
import org.bukkit.Location;
import org.bukkit.Sound;
import org.bukkit.entity.AnimalTamer;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Tameable;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.scheduler.BukkitRunnable;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.CombatUtils;
import com.gmail.nossr50.util.skills.ParticleEffectUtils;
public class TrackedTamingEntity extends BukkitRunnable {
private LivingEntity livingEntity;
private UUID id;
private long timeStamp;
private int length;
private Player owner;
protected TrackedTamingEntity(LivingEntity livingEntity) {
this.livingEntity = livingEntity;
this.id = livingEntity.getUniqueId();
this.timeStamp = System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR;
this.length = Config.getInstance().getTamingCOTWLength(livingEntity.getType()) * Misc.TICK_CONVERSION_FACTOR;
AnimalTamer tamer = ((Tameable)livingEntity).getOwner();
this.runTaskLater(mcMMO.p, length);
if (tamer != null && tamer instanceof Player) {
this.owner = (Player) tamer;
}
int tamingCOTWLength = Config.getInstance().getTamingCOTWLength(livingEntity.getType());
if (tamingCOTWLength > 0) {
this.length = tamingCOTWLength * Misc.TICK_CONVERSION_FACTOR;
this.runTaskLater(mcMMO.p, length);
}
}
@Override
@ -39,7 +52,10 @@ public class TrackedTamingEntity extends BukkitRunnable {
CombatUtils.dealDamage(livingEntity, livingEntity.getMaxHealth(), DamageCause.SUICIDE, livingEntity);
}
Taming.removeFromTracker(this);
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(owner);
TamingManager tamingManager = mcMMOPlayer.getTamingManager();
tamingManager.removeFromTracker(this);
this.cancel();
}
@ -50,8 +66,4 @@ public class TrackedTamingEntity extends BukkitRunnable {
protected UUID getID() {
return id;
}
protected long getTimeStamp() {
return timeStamp;
}
}