->Fixed a bug where the number of drops was exponentially increased

based on drop bonuses.
->Fix a bug with identifying valid Malleable Base Quest item types
properly.
->Fixed a bug where 1 player sleeping would cause the server tick time
to be modified drastically.
->Artifact base weapon damages have been buffed to reflect their wooden
counterparts.
->The size of Hellfire Creeper and Deadly Creeper angry explosions have
been reduced.
->Add getPlayerVelocity(Player) to API. (Returns player velocity in
m/sec.)
->Added DPS meter/Damage breakdown. Start the tracker with /dps. Stop it
again with /dps to view results.
->Fix "Piercing" Artifact Ability displayed value.
->Strikers are now invulnerable during the dash of Line Drive.
->Defenders can now press Q (drop key) to activate "Rejuvenation", which
gives a 2 second invulnerability window, and 10 seconds of Regeneration
X. Costs 20 shield durability. 2 minute cooldown.
->Wither skeletons, Guardian Bosses, and Pig Zombie Leaders are now
named properly.
->Using [] now displays the amount of items being held when linking
items.
->Server Icon updated with a night time picture of Twoside.
->Fix a bug where two minecarts would be produced when shooting a
minecart with a bow while riding in it.
->World shops now automatically sell the next available item stored in
the world shop chest when it sells out. (Ex. Putting stone and
cobblestone in a shop will switch the item to cobblestone once stone
sells. The price is not modified however.)
->Added isWorldShop(Block) to API.
->Deadly mobs had their base stats buffed slightly to decrease the
difficulty gap between Deadly and Hellfire mobs, while increasing the
step up from Dangerous to Deadly tier.
->Increased the Resistances of Dangerous, Deadly, and Hellfire Mobs that
do not wear armor normally.
->Eruption and Earth Wave damage values have been buffed significantly.
->Line Drive and Tumble are now activated by pressing Q (drop key)
instead of Shift+Q and Left-Click + Shift. Pressing Shift+Q during
Tumble will perform a backwards jump, while pressing Q will do the
current behavior.
->The Mysterous Entity no longer laughs at you repeatedly when dying in
the void.
->Cooldowns of skills now show up right when you login, so there is no
confusion about when you can first execute them.
->Modification to Ranger Mode: Only Sniping mode shoots lightning-fast
arrows now. Debilitation and Close Range mode shoot normal speed arrows.
This commit is contained in:
sigonasr2 2016-07-24 22:16:34 -05:00
parent 295a120e3b
commit 4506d0b7c1
23 changed files with 2177 additions and 1258 deletions

Binary file not shown.

View File

@ -1,6 +1,6 @@
name: TwosideKeeper
main: sig.plugin.TwosideKeeper.TwosideKeeper
version: 3.6.2r3
version: 3.7.0
commands:
money:
description: Tells the player the amount of money they are holding.
@ -101,4 +101,9 @@ commands:
description: Displays information about a mode.
usage: /mode <modename>
permission: TwosideKeeper.money
permission-message: No permissions!
dps:
description: DPS Logger.
usage: /dps
permission: TwosideKeeper.money
permission-message: No permissions!

View File

@ -109,7 +109,7 @@ public class AwakenedArtifact {
tc.addExtra(ac);
tc.addExtra(" to open up the ability upgrade menu.");
p.spigot().sendMessage(tc);*/
p.spigot().sendMessage(ArtifactAbility.GenerateMenu(ArtifactItemType.getArtifactItemTypeFromItemStack(p.getInventory().getItem(GenericFunctions.CalculateSlot(artifact,p))).getUpgradePath(), TwosideKeeper.CalculateWeaponDamage(p,null), artifact,GenericFunctions.CalculateSlot(artifact,p)));
p.spigot().sendMessage(ArtifactAbility.GenerateMenu(ArtifactItemType.getArtifactItemTypeFromItemStack(p.getInventory().getItem(GenericFunctions.CalculateSlot(artifact,p))).getUpgradePath(), NewCombat.CalculateWeaponDamage(p,null), artifact,GenericFunctions.CalculateSlot(artifact,p)));
return item;
} else {
return setEXP(artifact,totalval);

View File

@ -5,8 +5,6 @@ import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.entity.Monster;
import aPlugin.BlockUtils;
import aPlugin.Utils;
import net.minecraft.server.v1_9_R1.BlockPosition;
import sig.plugin.TwosideKeeper.HelperStructures.BlockToughness;
@ -35,7 +33,7 @@ public class ChargeZombie {
if (Math.abs(x)<outerradius &&
Math.abs(y)<outerradius+1 &&
Math.abs(z)<outerradius &&
!BlockUtils.isExplosionProof(m.getLocation().add(x,y,z).getBlock().getType()) ||
aPlugin.API.isDestroyable(m.getLocation().add(x,y,z).getBlock()) ||
m.getLocation().add(x,y,z).getBlock().getType()==Material.OBSIDIAN) {
if (!(y==0 && m.getTarget().getLocation().getY()>m.getLocation().getY()) || !m.getLocation().add(x,y,z).getBlock().getType().isSolid()) { //Player is higher than zombie. Don't break blocks in front of it. Climb up them. Unless it's lava.
if (!(y<0 && (m.getTarget().getLocation().getY()>m.getLocation().getY()-1))) { //Player is lower than zombie. Break blocks below it to get to the player.
@ -56,9 +54,9 @@ public class ChargeZombie {
m.getLocation().getWorld().playSound(m.getLocation().add(x,y,z),Sound.BLOCK_STONE_BREAK, 1.0f, 1.0f);
}
m.getLocation().add(x,y,z).getBlock().breakNaturally();
Utils.sendBlockBreakAnimation(null, new BlockPosition(m.getLocation().add(x,y,z).getBlockX(),m.getLocation().add(x,y,z).getBlockY(),m.getLocation().add(x,y,z).getBlockZ()), -1, Utils.seedRandomID(m.getLocation().add(x,y,z).getBlock()));
aPlugin.API.sendBlockBreakPacket(m.getLocation().add(x,y,z).getBlock(), -1);
} else {
Utils.sendBlockBreakAnimation(null, new BlockPosition(m.getLocation().add(x,y,z).getBlockX(),m.getLocation().add(x,y,z).getBlockY(),m.getLocation().add(x,y,z).getBlockZ()), 4, Utils.seedRandomID(m.getLocation().add(x,y,z).getBlock()));
aPlugin.API.sendBlockBreakPacket(m.getLocation().add(x,y,z).getBlock(), (int)(Math.random()*6)+3);
}
}
}
@ -69,7 +67,7 @@ public class ChargeZombie {
//This block can be destroyed if it is a liquid.
if (m.getLocation().add(x,y,z).getBlock().isLiquid()) {
m.getLocation().add(x,y,z).getBlock().breakNaturally();
Utils.sendBlockBreakAnimation(null, new BlockPosition(m.getLocation().add(x,y,z).getBlockX(),m.getLocation().add(x,y,z).getBlockY(),m.getLocation().add(x,y,z).getBlockZ()), -1, Utils.seedRandomID(m.getLocation().add(x,y,z).getBlock()));
aPlugin.API.sendBlockBreakPacket(m.getLocation().add(x,y,z).getBlock(), -1);
}
}
}

View File

@ -0,0 +1,24 @@
package sig.plugin.TwosideKeeper;
import java.text.DecimalFormat;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import aPlugin.DiscordMessageSender;
import net.minecraft.server.v1_9_R1.MinecraftServer;
public class DiscordStatusUpdater implements Runnable{
@Override
public void run() {
DiscordMessageSender.setPlaying(ProduceMessage());
Bukkit.getServer().getScheduler().runTaskLaterAsynchronously(Bukkit.getPluginManager().getPlugin("TwosideKeeper"), this, 300l);
}
String ProduceMessage() {
DecimalFormat df = new DecimalFormat("0.00");
return ChatColor.stripColor("TPS: "+df.format(MinecraftServer.getServer().recentTps[0])+" "+TwosideKeeper.getWeatherIcon()+" "+TwosideKeeper.getTimeOfDay()+" ("+Bukkit.getOnlinePlayers().size()+")");
}
}

View File

@ -18,6 +18,7 @@ import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent;
import sig.plugin.TwosideKeeper.AwakenedArtifact;
import sig.plugin.TwosideKeeper.NewCombat;
import sig.plugin.TwosideKeeper.TwosideKeeper;
import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions;
@ -87,11 +88,11 @@ public enum ArtifactAbility {
//Shovel abilities
SUPPRESS("Suppression",ChatColor.GRAY+"[Unimplemented] Suppresses a mob on hit for [VAL] seconds.\n\n"
+ "Suppression prevents movement, attacking, and teleportation.",new double[]{0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1},
+ "Suppression prevents movement, attacking, exploding, and teleportation.",new double[]{0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1},
new double[]{1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0},100,1000,UpgradePath.SHOVEL),
ERUPTION("Eruption","Sneak while Left-clicking a mob to damage mobs for [VAL] damage and knock them up. The eruption also destroys the ground beneath you.",new double[]{6.0,7,8.0,9,10.0,11,12.0,13,14.0,15},
ERUPTION("Eruption","Sneak while Left-clicking a mob to damage mobs for [VAL] damage and knock them up. The eruption also destroys the ground beneath you.",new double[]{11.0,13,15.0,17,19.0,21,24.0,27,30.0,40},
new double[]{1.0,0.925,0.85,0.775,0.7,0.625,0.55,0.475,0.4,0.325},100,40,UpgradePath.SHOVEL),
EARTHWAVE("Earth Wave","While in combat, destroy a block to send a wave of earth towards your enemies. Enemies standing inside of the waves take [VAL] damage every second.",new double[]{8,9,10,11,12,13,14,15,16,18},
EARTHWAVE("Earth Wave","While in combat, destroy a block to send a wave of earth towards your enemies. Enemies standing inside of the waves take [VAL] damage every second.",new double[]{10,12,14,16,18,20,22,24,26,30},
new double[]{2.4,2.2,2.0,1.9,1.8,1.7,1.6,1.5,1.4,1.2},100,100,UpgradePath.SHOVEL),
//Axe abilities
@ -435,7 +436,7 @@ public enum ArtifactAbility {
tc.addExtra(ac);
tc.addExtra(" to open up the ability upgrade menu.");;*/
p.spigot().sendMessage(tc);
p.spigot().sendMessage(ArtifactAbility.GenerateMenu(ArtifactItemType.getArtifactItemTypeFromItemStack(p.getInventory().getItem(GenericFunctions.CalculateSlot(item,p))).getUpgradePath(), TwosideKeeper.CalculateWeaponDamage(p,null), item,GenericFunctions.CalculateSlot(item,p)));
p.spigot().sendMessage(ArtifactAbility.GenerateMenu(ArtifactItemType.getArtifactItemTypeFromItemStack(p.getInventory().getItem(GenericFunctions.CalculateSlot(item,p))).getUpgradePath(), NewCombat.CalculateWeaponDamage(p,null), item,GenericFunctions.CalculateSlot(item,p)));
}
} else {
if (ability.GetMaxLevel()<=level) {

View File

@ -0,0 +1,30 @@
package sig.plugin.TwosideKeeper.HelperStructures;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions;
/**
* Defines all the effects and calculations applied by artifact abilities.
*/
public class ArtifactAbilityApplyEffects {
//Returns true if the player has this artifact ability on one of their equipment.
public static boolean canExecuteArtifactAbility(ArtifactAbility ab, Player p) {
//First check the main hand.
ItemStack[] testitems = {
p.getEquipment().getItemInMainHand(),
p.getEquipment().getHelmet(),
p.getEquipment().getChestplate(),
p.getEquipment().getLeggings(),
p.getEquipment().getBoots(),
};
for (int i=0;i<testitems.length;i++) {
if (GenericFunctions.isArtifactEquip(testitems[i]) &&
ArtifactAbility.containsEnchantment(ab, testitems[i])) {
return true;
}
}
return false;
}
}

View File

@ -0,0 +1,62 @@
package sig.plugin.TwosideKeeper.HelperStructures.Common;
import org.bukkit.entity.AreaEffectCloud;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import sig.plugin.TwosideKeeper.TwosideKeeper;
public enum DamageType {
PLAYERVSMOB,
MOBVSPLAYER,
MOBPROJECTILEVSPLAYER,
MOBPROJECTILEVSMOB,
MOBVSMOB,
SPELLVSMOB,
PLAYERPROJECTILEVSMOB,
OTHER;
public static DamageType DetectType(LivingEntity target, Entity damager) {
if ((damager instanceof Player) &&
(target instanceof LivingEntity)) {
return PLAYERVSMOB;
} else
if ((target instanceof Player) &&
(damager instanceof LivingEntity)) {
return MOBVSPLAYER;
} else
if ((damager instanceof Projectile) &&
((Projectile)damager).getShooter()!=null &&
(((Projectile)damager).getShooter() instanceof LivingEntity) &&
(target instanceof Player)) {
return MOBPROJECTILEVSPLAYER;
} else
if ((damager instanceof Projectile) &&
((Projectile)damager).getShooter()!=null &&
(((Projectile)damager).getShooter() instanceof Player) &&
(target instanceof LivingEntity)) {
return PLAYERPROJECTILEVSMOB;
} else
if ((damager instanceof Projectile) &&
((Projectile)damager).getShooter()!=null &&
(((Projectile)damager).getShooter() instanceof LivingEntity) &&
(target instanceof LivingEntity)) {
return MOBPROJECTILEVSMOB;
} else
if ((target instanceof LivingEntity) &&
(damager instanceof LivingEntity)) {
return MOBVSMOB;
} else
if ((target instanceof LivingEntity) &&
(damager instanceof AreaEffectCloud)) {
return SPELLVSMOB;
} else
{
TwosideKeeper.log("Detected a OTHER event. Target was "+target.getType().name()+" and damager was "+damager.getType().name(), 2);
return OTHER;
}
}
}

View File

@ -1,7 +1,10 @@
package sig.plugin.TwosideKeeper.HelperStructures.Common;
import java.util.ArrayList;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@ -12,14 +15,17 @@ import org.bukkit.block.Block;
import org.bukkit.block.Sign;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Guardian;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Monster;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.Skeleton;
import org.bukkit.entity.Skeleton.SkeletonType;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.EntityDamageEvent.DamageModifier;
import org.bukkit.event.entity.EntityDeathEvent;
@ -31,7 +37,11 @@ import org.bukkit.material.MaterialData;
import org.bukkit.material.Wool;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector;
import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import net.md_5.bungee.api.chat.ClickEvent;
@ -42,6 +52,7 @@ import sig.plugin.TwosideKeeper.Artifact;
import sig.plugin.TwosideKeeper.AwakenedArtifact;
import sig.plugin.TwosideKeeper.MonsterController;
import sig.plugin.TwosideKeeper.MonsterStructure;
import sig.plugin.TwosideKeeper.NewCombat;
import sig.plugin.TwosideKeeper.PlayerStructure;
import sig.plugin.TwosideKeeper.TwosideKeeper;
import sig.plugin.TwosideKeeper.HelperStructures.ArtifactAbility;
@ -75,7 +86,6 @@ public class GenericFunctions {
return breakHardenedItem(item,null);
}
public static ItemStack breakHardenedItem(ItemStack item, Player p) {
int break_count = getHardenedItemBreaks(item);
boolean is_magic = false;
@ -1534,6 +1544,15 @@ public class GenericFunctions {
case HAY_BLOCK:{
return "Hay Bale";
}
case SKULL:{
return "Wither Skeleton Skull";
}
case SPECKLED_MELON:{
return "Glistering Melon";
}
case WORKBENCH:{
return "Crafting Table";
}
default:{
return GenericFunctions.CapitalizeFirstLetters(type.getType().toString().replace("_", " "));
}
@ -1741,7 +1760,7 @@ public class GenericFunctions {
item.getType().toString().contains("AXE") ||
item.getType().toString().contains("SWORD") ||
item.getType().toString().contains("BOW") ||
item.getType().toString().contains("ROD") ||
item.getType().toString().contains("FISHING_ROD") ||
item.getType().toString().contains("HOE") ||
item.getType().toString().contains("BOOTS") ||
item.getType().toString().contains("CHESTPLATE") ||
@ -1855,9 +1874,11 @@ public class GenericFunctions {
}
}
public static boolean isRanger(Player p) {
if (p!=null && !p.isDead() && p.getEquipment().getItemInMainHand()!=null && p.getEquipment().getItemInMainHand().getType()==Material.BOW &&
(p.getInventory().getExtraContents()[0]==null || !p.getInventory().getExtraContents()[0].getType().toString().contains("SHIELD")) &&
AllLeatherArmor(p)) {
if (p!=null && !p.isDead() && (((p.getEquipment().getItemInMainHand()!=null && p.getEquipment().getItemInMainHand().getType()==Material.BOW && (p.getInventory().getExtraContents()[0]==null || p.getInventory().getExtraContents()[0].getType()==Material.AIR)) || //Satisfy just a bow in main hand.
(p.getEquipment().getItemInMainHand()!=null && p.getEquipment().getItemInMainHand().getType()==Material.BOW && p.getInventory().getExtraContents()[0]!=null && p.getInventory().getExtraContents()[0].getType()!=Material.SHIELD) || /*Satisfy a bow in main hand and no shield in off-hand.*/
(p.getEquipment().getItemInMainHand()!=null && p.getEquipment().getItemInMainHand().getType()!=Material.SHIELD && p.getInventory().getExtraContents()[0]!=null && p.getInventory().getExtraContents()[0].getType()==Material.BOW) || /*Satisfy a bow in off-hand and no shield in main hand.*/
((p.getEquipment().getItemInMainHand()==null || p.getEquipment().getItemInMainHand().getType()==Material.AIR) && p.getInventory().getExtraContents()[0]!=null && p.getInventory().getExtraContents()[0].getType()==Material.BOW)) /*Satisfy just a bow in off-hand.*/ &&
AllLeatherArmor(p))) {
return true;
} else {
return false;
@ -2257,15 +2278,17 @@ public class GenericFunctions {
if (ent instanceof Monster) {
Monster m = (Monster)ent;
m.setCustomNameVisible(false);
if (m.getCustomName()!=null) {
m.setCustomName(ChatColor.stripColor(m.getCustomName()));
if (m.getCustomName().contains("Dangerous")) {
m.setCustomName(ChatColor.DARK_AQUA+m.getCustomName());
}
if (m.getCustomName().contains("Deadly")) {
m.setCustomName(ChatColor.GOLD+m.getCustomName());
}
if (m.getCustomName().contains("Hellfire")) {
m.setCustomName(ChatColor.DARK_RED+m.getCustomName());
if (m.getCustomName().contains("Dangerous")) {
m.setCustomName(ChatColor.DARK_AQUA+m.getCustomName());
}
if (m.getCustomName().contains("Deadly")) {
m.setCustomName(ChatColor.GOLD+m.getCustomName());
}
if (m.getCustomName().contains("Hellfire")) {
m.setCustomName(ChatColor.DARK_RED+m.getCustomName());
}
}
}
}
@ -2326,7 +2349,7 @@ public class GenericFunctions {
}
}
PlayerStructure pd = (PlayerStructure)TwosideKeeper.playerdata.get(p.getUniqueId());
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
if (rangerarmort1==4 || rangerarmort2==4 || rangerarmort3==4 || rangerarmort4==4) {
//Player has the full set.
@ -2366,7 +2389,7 @@ public class GenericFunctions {
}
}
PlayerStructure pd = (PlayerStructure)TwosideKeeper.playerdata.get(p.getUniqueId());
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
if (ArtifactAbility.containsEnchantment(ArtifactAbility.SHADOWWALKER, p.getEquipment().getItemInMainHand()) &&
p.isOnGround() && p.getLocation().getY()>=0 && p.getLocation().add(0,0,0).getBlock().getLightLevel()<=4) {
@ -2518,28 +2541,13 @@ public class GenericFunctions {
}
}
@Deprecated
public static void DealDamageToMob(double dmg, LivingEntity target, LivingEntity damager, boolean truedmg) {
if (damager!=null && (target instanceof Monster) && !target.isDead()) {
Monster m = (Monster)target;
m.setTarget(damager);
}
double finaldmg = 0;
if (truedmg) {
finaldmg = dmg;
} else {
finaldmg = TwosideKeeper.CalculateDamageReduction(dmg, target, damager);
}
if (target.hasPotionEffect(PotionEffectType.ABSORPTION)) {
//We attempt to absorb the amount of damage of absorption level we have.
finaldmg-=(GenericFunctions.getPotionEffectLevel(PotionEffectType.ABSORPTION, target)+1)*4;
if (finaldmg<0) {
finaldmg=0;
}
}
if ((target instanceof Monster) && damager!=null) {
DealDamageToMob(dmg,target,damager);
}
public static void DealDamageToMob(double dmg, LivingEntity target, LivingEntity damager) {
if (damager!=null && (target instanceof Monster)) {
Monster m = (Monster)target;
m.setTarget(damager);
if (TwosideKeeper.monsterdata.containsKey(m.getUniqueId())) {
@ -2549,19 +2557,14 @@ public class GenericFunctions {
TwosideKeeper.monsterdata.put(m.getUniqueId(),new MonsterStructure(damager));
}
}
TwosideKeeper.log("Attack is dealing "+finaldmg, 2);
if (target.getHealth()>finaldmg) {
TwosideKeeper.log("NOT FULL HEALTH. HP: "+target.getHealth(), 5);
target.setHealth(target.getHealth()-finaldmg);
target.damage(0.000001);
target.setNoDamageTicks(20);
} else {
//Bukkit.getPluginManager().callEvent(new EntityDamageByEntityEvent(damager,target,DamageCause.ENTITY_ATTACK,finaldmg));
target.setHealth(0.0001);
target.damage(99999);
target.setHealth(0);
}
}
aPlugin.API.sendEntityHurtAnimation(target);
TwosideKeeper.log("Call event with "+dmg, 5);
TwosideKeeper.log(GenericFunctions.GetEntityDisplayName(damager)+"->"+
GenericFunctions.GetEntityDisplayName(target)+ChatColor.WHITE+": Damage dealt was "+dmg,2);
double oldhp=((LivingEntity)target).getHealth();
GenericFunctions.subtractHealth(target, dmg);
TwosideKeeper.log(ChatColor.BLUE+" "+oldhp+"->"+((LivingEntity)target).getHealth()+" HP",3);
}
public static boolean searchfor(List<String> stringy, String searchfor) {
for (int i=0;i<stringy.size();i++) {
@ -2588,10 +2591,10 @@ public class GenericFunctions {
}
public static void PerformDodge(Player p) {
if (p.isSneaking() && p.isOnGround() && GenericFunctions.isRanger(p) &&
GenericFunctions.getBowMode(p.getEquipment().getItemInMainHand())==BowMode.CLOSE) {
PlayerStructure pd = (PlayerStructure)TwosideKeeper.playerdata.get(p.getUniqueId());
if (pd.last_dodge+100<=TwosideKeeper.getServerTickTime()) {
if (p.isOnGround() && GenericFunctions.isRanger(p) &&
(GenericFunctions.getBowMode(p.getEquipment().getItemInMainHand())==BowMode.CLOSE)) {
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
if (pd.last_dodge+TwosideKeeper.DODGE_COOLDOWN<=TwosideKeeper.getServerTickTime()) {
pd.last_dodge=TwosideKeeper.getServerTickTime();
aPlugin.API.sendCooldownPacket(p, p.getEquipment().getItemInMainHand(), 100);
aPlugin.API.sendCooldownPacket(p, p.getEquipment().getItemInMainHand(), 100);
@ -2603,7 +2606,11 @@ public class GenericFunctions {
dodgeduration=60;
}
p.setVelocity(p.getLocation().getDirection().multiply(1.4f));
if (p.isSneaking()) { //Do a backwards dodge + jump.
p.setVelocity(p.getLocation().getDirection().multiply(-0.7f));
} else {
p.setVelocity(p.getLocation().getDirection().multiply(1.4f));
}
p.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION,dodgeduration,0));
p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,dodgeduration,2));
@ -2611,4 +2618,86 @@ public class GenericFunctions {
}
}
}
public static String GetEntityDisplayName(Entity e) {
if (e instanceof LivingEntity) {
LivingEntity l = (LivingEntity)e;
if (l.getCustomName()!=null) {
return l.getCustomName();
}
if (l instanceof Player) {
Player p = (Player)l;
return p.getName();
}
}
if (e instanceof Projectile) {
Projectile proj = (Projectile)e;
String finalname = CapitalizeFirstLetters(proj.getType().name().replace("_", " "));
if (proj.getShooter() instanceof LivingEntity) {
LivingEntity l = (LivingEntity)proj.getShooter();
if (l.getCustomName()!=null) {
return finalname+"("+l.getCustomName()+ChatColor.GRAY+")";
}
if (l instanceof Player) {
Player p = (Player)l;
return finalname+"("+p.getName()+ChatColor.GRAY+")";
}
}
}
return e.getType().name()+ChatColor.WHITE;
}
//Returns player velocity in m/sec.
public static double GetPlayerVelocity(Player p) {
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
return 93.182445*pd.velocity;
}
public static double getAbilityValue(ArtifactAbility ab, ItemStack weapon) {
return ArtifactAbility.calculateValue(ab, weapon.getEnchantmentLevel(Enchantment.LUCK), ArtifactAbility.getEnchantmentLevel(ab, weapon));
}
public static void subtractHealth(final LivingEntity entity, double dmg) {
if (entity.getHealth()>dmg) {
entity.setHealth(entity.getHealth()-dmg);
} else {
/*List<ItemStack> drops = new ArrayList<ItemStack>();
EntityDeathEvent ev = new EntityDeathEvent(entity,drops);
Bukkit.getPluginManager().callEvent(ev);
entity.setHealth(0);*/
entity.damage(Integer.MAX_VALUE);
}
}
public static boolean isViewingInventory(Player p) {
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
return pd.isViewingInventory;
}
public static void addIFrame(Player p, int ticks) {
p.removePotionEffect(PotionEffectType.GLOWING);
p.addPotionEffect(new PotionEffect(PotionEffectType.GLOWING,ticks,0));
p.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION,ticks,0));
}
public static void PerformRejuvenate(Player player) {
PlayerStructure pd = (PlayerStructure)TwosideKeeper.playerdata.get(player.getUniqueId());
if (pd.last_rejuvenate+TwosideKeeper.REJUVENATE_COOLDOWN<=TwosideKeeper.getServerTickTime()) {
player.playSound(player.getLocation(), Sound.ENTITY_ZOMBIE_VILLAGER_CURE, 1.0f, 1.0f);
addIFrame(player,40);
player.removePotionEffect(PotionEffectType.REGENERATION);
player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION,200,9));
aPlugin.API.damageItem(player, player.getEquipment().getItemInMainHand(), 20);
pd.last_rejuvenate = TwosideKeeper.getServerTickTime();
}
}
public static boolean isArmoredMob(Monster m) {
if (m.getType()==EntityType.ZOMBIE ||
m.getType()==EntityType.PIG_ZOMBIE ||
m.getType()==EntityType.SKELETON) {
return true;
}
return false;
}
}

View File

@ -192,12 +192,6 @@ public class Loot {
if (Math.random()<0.08*HARDENED_ENCHANT_MULT) {item.addUnsafeEnchantment(Enchantment.THORNS, GetEnchantmentLevels(item.getType(),hardened));}
//item.addUnsafeEnchantment(Enchantment.KNOCKBACK, 1);
if (Math.random()<0.001*HARDENED_ENCHANT_MULT) {item.addUnsafeEnchantment(Enchantment.MENDING, GetEnchantmentLevels(item.getType(),hardened));}
} else
if (item.getType()==Material.FISHING_ROD) {
item.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, GetEnchantmentLevels(item.getType(),hardened));
item.addUnsafeEnchantment(Enchantment.DURABILITY, GetEnchantmentLevels(item.getType(),hardened));
item.addUnsafeEnchantment(Enchantment.LUCK, GetEnchantmentLevels(item.getType(),hardened));
item.addUnsafeEnchantment(Enchantment.LURE, (int)(((Math.random()*3)+2)*((hardened)?HARDENED_ENCHANT_MULT:1)));
} else {
//Generic Random Enchantments.
for (int i=0;i<Enchantment.values().length;i++) {
@ -206,6 +200,12 @@ public class Loot {
}
}
}
if (item.getType()==Material.FISHING_ROD) {
item.addUnsafeEnchantment(Enchantment.DAMAGE_ALL, GetEnchantmentLevels(item.getType(),hardened));
item.addUnsafeEnchantment(Enchantment.DURABILITY, GetEnchantmentLevels(item.getType(),hardened));
item.addUnsafeEnchantment(Enchantment.LUCK, GetEnchantmentLevels(item.getType(),hardened));
item.addUnsafeEnchantment(Enchantment.LURE, (int)(((Math.random()*3)+2)*((hardened)?HARDENED_ENCHANT_MULT:1)));
}
return item;
}
}

View File

@ -115,18 +115,6 @@ public class MalleableBaseQuest {
ItemMeta m = base.getItemMeta();
List<String> lore = m.getLore();
String material_name = lore.get(1).split("'")[1];
if (lore.get(1).contains("Arrow of")) {
return "Tipped Arrow";
} else
if (lore.get(1).contains("Splash Potion")) {
return "Splash Potion";
} else
if (lore.get(1).contains("Lingering Potion")) {
return "Lingering Potion";
} else
if (lore.get(1).contains("Potion")) {
return "Potion";
} else
if (lore.get(1).contains("Jack o")) {
return "Jack o'Lantern";
} else {

View File

@ -204,7 +204,7 @@ public enum MonsterDifficulty {
for (int i=0;i<dropmult;i++) {
TwosideKeeper.Loot_Logger.AddLootRoll();
//First do a common roll.
if (Math.random()<TwosideKeeper.COMMON_DROP_RATE*dropmult &&
if (Math.random()<TwosideKeeper.COMMON_DROP_RATE &&
this.loot_regular.length>0) {
//This is a common roll.
ItemStack gen_loot = DistributeRandomLoot(this.loot_regular, isRanger);
@ -213,7 +213,7 @@ public enum MonsterDifficulty {
TwosideKeeper.Loot_Logger.AddCommonLoot();
}
//Rare Loot roll.
if (Math.random()<TwosideKeeper.RARE_DROP_RATE*dropmult &&
if (Math.random()<TwosideKeeper.RARE_DROP_RATE &&
this.loot_rare.length>0) {
//This is a common roll.
ItemStack gen_loot = DistributeRandomLoot(this.loot_rare, isRanger);
@ -238,7 +238,7 @@ public enum MonsterDifficulty {
TwosideKeeper.Loot_Logger.AddRareLoot();
}
//Legendary Loot roll.
if (Math.random()<TwosideKeeper.LEGENDARY_DROP_RATE*dropmult &&
if (Math.random()<TwosideKeeper.LEGENDARY_DROP_RATE &&
this.loot_legendary.length>0) {
//This is a common roll.
ItemStack gen_loot = DistributeRandomLoot(this.loot_legendary, isRanger);

View File

@ -16,22 +16,22 @@ import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions;
public class ShopPurchase {
String player;
String customer;
int shopID;
ItemStack item;
double money;
int amt;
boolean sell;
public ShopPurchase(String p, Player customer, int shopID, double money, int amt) {
ShopPurchase(p,customer,shopID,money,amt,true); //Assume this is a selling purchase by default.
public ShopPurchase(String p, Player customer, ItemStack item, double money, int amt) {
ShopPurchase(p,customer,item,money,amt,true); //Assume this is a selling purchase by default.
}
public ShopPurchase(String p, Player customer, int shopID, double money, int amt, boolean sell) {
ShopPurchase(p,customer,shopID,money,amt,sell); //Assume this is a selling purchase by default.
public ShopPurchase(String p, Player customer, ItemStack item, double money, int amt, boolean sell) {
ShopPurchase(p,customer,item,money,amt,sell); //Assume this is a selling purchase by default.
}
public void ShopPurchase(String p, Player customer, int shopID, double money, int amt, boolean sell) {
public void ShopPurchase(String p, Player customer, ItemStack item, double money, int amt, boolean sell) {
this.player = p;
this.customer=customer.getName();
this.shopID = shopID;
this.item=item;
this.money = money;
this.amt=amt;
this.sell=sell;
@ -47,20 +47,18 @@ public class ShopPurchase {
public TextComponent announcementString() {
DecimalFormat df = new DecimalFormat("0.00");
if (sell) {
WorldShop ss = TwosideKeeper.TwosideShops.LoadWorldShopData(shopID);
TextComponent message1 = new TextComponent("Player "+ChatColor.BLUE+customer+ChatColor.WHITE+" has purchased "+ChatColor.YELLOW+amt+ChatColor.WHITE+" of your ");
TextComponent message2 = new TextComponent(ChatColor.GREEN+"["+GenericFunctions.GetItemName(ss.GetItem())+ChatColor.RESET+""+ChatColor.GREEN+"]");
message2.setHoverEvent(new HoverEvent( HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(GenericFunctions.GetItemName(ss.GetItem())+WorldShop.GetItemInfo(ss.GetItem())).create()));
TextComponent message2 = new TextComponent(ChatColor.GREEN+"["+GenericFunctions.GetItemName(this.item)+ChatColor.RESET+""+ChatColor.GREEN+"]");
message2.setHoverEvent(new HoverEvent( HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(GenericFunctions.GetItemName(this.item)+WorldShop.GetItemInfo(this.item)).create()));
TextComponent message3 = new TextComponent(". You have earned $"+df.format(money)+". "+ChatColor.GRAY+""+ChatColor.ITALIC+"(See /money)");
TextComponent finalmsg = message1;
finalmsg.addExtra(message2);
finalmsg.addExtra(message3);
return finalmsg;
} else {
WorldShop ss = TwosideKeeper.TwosideShops.LoadWorldShopData(shopID);
TextComponent message1 = new TextComponent("Player "+ChatColor.BLUE+customer+ChatColor.WHITE+" has sold "+ChatColor.YELLOW+amt+ChatColor.WHITE+" ");
TextComponent message2 = new TextComponent(ChatColor.GREEN+"["+GenericFunctions.GetItemName(ss.GetItem())+ChatColor.RESET+""+ChatColor.GREEN+"]");
message2.setHoverEvent(new HoverEvent( HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(GenericFunctions.GetItemName(ss.GetItem())+WorldShop.GetItemInfo(ss.GetItem())).create()));
TextComponent message2 = new TextComponent(ChatColor.GREEN+"["+GenericFunctions.GetItemName(this.item)+ChatColor.RESET+""+ChatColor.GREEN+"]");
message2.setHoverEvent(new HoverEvent( HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(GenericFunctions.GetItemName(this.item)+WorldShop.GetItemInfo(this.item)).create()));
TextComponent message3 = new TextComponent(" to you. $"+df.format(money)+" has been deducted from your bank account. "+ChatColor.GRAY+""+ChatColor.ITALIC+"(Check your shop to collect your items.)");
TextComponent finalmsg = message1;
finalmsg.addExtra(message2);

View File

@ -80,6 +80,9 @@ public class WorldShop {
public void UpdateUnitPrice(double price) {
this.price=price;
}
public void UpdateItem(ItemStack item) {
this.item=item;
}
public ItemStack GetItem() {
return item;
@ -714,6 +717,38 @@ public class WorldShop {
}
}
public static void removeShopItem(Sign s, WorldShop shop) {
Collection<Entity> nearby = WorldShop.getBlockShopSignAttachedTo(s).getWorld().getNearbyEntities(WorldShop.getBlockShopSignAttachedTo(s).getLocation().add(0.5,0,0.5), 0.3, 1, 0.3);
for (int i=0;i<nearby.size();i++) {
Entity e = Iterables.get(nearby, i);
if (e.getType()==EntityType.DROPPED_ITEM) {
TwosideKeeper.log("Found a drop.",5);
Item it = (Item)e;
ItemStack checkdrop = shop.GetItem().clone();
checkdrop = Artifact.convert(checkdrop);
checkdrop.removeEnchantment(Enchantment.LUCK);
ItemMeta m = checkdrop.getItemMeta();
List<String> lore = new ArrayList<String>();
if (m.hasLore()) {
lore = m.getLore();
}
lore.add("WorldShop Display Item");
m.setLore(lore);
checkdrop.setItemMeta(m);
TwosideKeeper.log("Comparing item "+it.getItemStack().toString()+" to "+checkdrop.toString(),5);
if (it.getItemStack().isSimilar(checkdrop) &&
Artifact.isArtifact(it.getItemStack())) {
TwosideKeeper.log("Same type.",5);
e.remove();
e.setCustomNameVisible(false);
e.setCustomName(null);
}
}
}
}
public static void spawnShopItem(PlayerInteractEvent ev, Location loc, WorldShop shop) {
//See if a drop entity is already here.
boolean item_here=false;

View File

@ -17,14 +17,14 @@ public class ItemCubeWindow {
}
public static void addItemCubeWindow(Player p, int id, int size) {
PlayerStructure pd = (PlayerStructure)TwosideKeeper.playerdata.get(p.getUniqueId());
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
pd.openeditemcube.add(new ItemCubeWindow(id, size));
pd.opened_inventory = true;
TwosideKeeper.log("Item Cube Window added. List is now size "+pd.openeditemcube.size(),2);
}
public static void popItemCubeWindow(Player p) {
PlayerStructure pd = (PlayerStructure)TwosideKeeper.playerdata.get(p.getUniqueId());
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
if (!pd.opened_inventory &&
pd.openeditemcube.size()>0) {
ItemCubeWindow window = pd.openeditemcube.remove(pd.openeditemcube.size()-1);
@ -36,14 +36,14 @@ public class ItemCubeWindow {
}
public static void removeAllItemCubeWindows(Player p) {
PlayerStructure pd = (PlayerStructure)TwosideKeeper.playerdata.get(p.getUniqueId());
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
pd.openeditemcube.clear();
}
//New open item cube method to handle all opening of item cubes.
public static void openItemCube(Player p, int id, int size, boolean addToList) {
TwosideKeeper.log("Called.", 2);
PlayerStructure pd = (PlayerStructure)TwosideKeeper.playerdata.get(p.getUniqueId());
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
if (addToList &&
isViewingItemCubeInventory(p)) {
addItemCubeWindow(p,getViewingItemCubeID(p),getViewingItemCubeInventorySize(p));
@ -62,7 +62,7 @@ public class ItemCubeWindow {
}
public static boolean isViewingItemCubeInventory(Player p) {
PlayerStructure pd = (PlayerStructure)TwosideKeeper.playerdata.get(p.getUniqueId());
PlayerStructure pd = PlayerStructure.GetPlayerStructure(p);
TwosideKeeper.log("Are we viewing it? "+pd.isViewingItemCube,2);
return pd.isViewingItemCube;
}

View File

@ -0,0 +1,132 @@
package sig.plugin.TwosideKeeper.Logging;
import java.text.DecimalFormat;
import java.util.HashMap;
import org.bukkit.entity.Player;
import com.google.common.collect.Iterables;
import net.md_5.bungee.api.ChatColor;
import sig.plugin.TwosideKeeper.PlayerStructure;
import sig.plugin.TwosideKeeper.TwosideKeeper;
public class DamageLogger {
HashMap<String,Double> breakdownlist;
double totaldmg;
double actualtotaldmg=0.0;
double calculatedtotaldmg=0.0;
double totalmult=0.0;
int totalhits=0;
String player;
long recordtime;
public DamageLogger(Player p) {
this.breakdownlist=new HashMap<String,Double>();
totaldmg=0;
this.player=p.getName();
this.recordtime=TwosideKeeper.getServerTickTime();
}
public void startRecording() {
this.totaldmg=0;
this.calculatedtotaldmg=0.0;
this.actualtotaldmg=0.0;
this.breakdownlist.clear();
this.totalmult=0.0;
this.totalhits=0;
this.recordtime=TwosideKeeper.getServerTickTime();
}
public void addMultiplierToLogger(String name, double val) {
if (val!=1.0) {
if (breakdownlist.containsKey(name)) {
//Add to the already existing value.
double dmg = breakdownlist.get(name);
dmg+=val;
breakdownlist.put(name, dmg);
} else {
breakdownlist.put(name, val);
}
totalmult+=val;
}
}
public void addEventToLogger(String name, double val) {
if (val!=0.0) {
if (breakdownlist.containsKey(name)) {
//Add to the already existing value.
double dmg = breakdownlist.get(name);
dmg+=val;
breakdownlist.put(name, dmg);
} else {
breakdownlist.put(name, val);
}
totaldmg+=val;
}
}
public void addCalculatedActualDamage(double val) {
this.actualtotaldmg+=val;
this.totalhits++;
}
public void addCalculatedTotalDamage(double val) {
this.calculatedtotaldmg+=val;
}
public String OutputResults() {
StringBuilder finalstring = new StringBuilder();
DecimalFormat df = new DecimalFormat("0.00");
for (int i=0;i<breakdownlist.size();i++) {
if (((String)breakdownlist.keySet().toArray()[i]).contains("Mult")) {
if (breakdownlist.get(breakdownlist.keySet().toArray()[i])!=1.0d && ((this.actualtotaldmg-this.totaldmg)*(breakdownlist.get(breakdownlist.keySet().toArray()[i])/this.totalmult))>0) {
finalstring.append(breakdownlist.keySet().toArray()[i]+": "+getPercentColor(breakdownlist.get(breakdownlist.keySet().toArray()[i]),totalmult)+"x"+df.format(breakdownlist.get(breakdownlist.keySet().toArray()[i])/this.totalhits)+" - "+df.format(((this.actualtotaldmg-this.totaldmg)*(breakdownlist.get(breakdownlist.keySet().toArray()[i])/this.totalmult)))+" dmg");
}
} else {
if (breakdownlist.get(breakdownlist.keySet().toArray()[i])!=0.0d) {
finalstring.append(breakdownlist.keySet().toArray()[i]+": "+getPercentColor(breakdownlist.get(breakdownlist.keySet().toArray()[i]),totaldmg)+df.format(breakdownlist.get(breakdownlist.keySet().toArray()[i])));
}
}
finalstring.append("\n");
}
finalstring.append(ChatColor.GRAY+""+ChatColor.BOLD+" Raw Damage: "+df.format(actualtotaldmg)+"\n");
finalstring.append(ChatColor.GOLD+""+ChatColor.ITALIC+" Final Damage: "+df.format(calculatedtotaldmg)+" (Average "+df.format((1-(this.calculatedtotaldmg/this.actualtotaldmg))*100)+"% Reduction)\n");
double elapsedtime = ((TwosideKeeper.getServerTickTime()-recordtime)/20d);
double dps = actualtotaldmg/elapsedtime;
finalstring.append(ChatColor.YELLOW+" Elapsed Time: "+ChatColor.AQUA+df.format(elapsedtime)+"s "+ChatColor.WHITE+"("+df.format(dps)+" damage/sec)");
return finalstring.toString();
}
private ChatColor getPercentColor(Double val, Double total) {
if (val/total>=0.9) {
return ChatColor.DARK_RED;
}else
if (val/total>=0.8) {
return ChatColor.RED;
}else
if (val/total>=0.7) {
return ChatColor.GOLD;
}else
if (val/total>=0.5) {
return ChatColor.YELLOW;
}else
if (val/total>=0.3) {
return ChatColor.GREEN;
}else
if (val/total>=0.2) {
return ChatColor.AQUA;
}else
if (val/total>=0.1) {
return ChatColor.DARK_AQUA;
}
return ChatColor.GRAY;
}
public static void AddNewCalculation(Player p, String name, double val, double reducedval) {
PlayerStructure pd = TwosideKeeper.playerdata.get(p.getUniqueId());
pd.damagedata.addEventToLogger(name, val);
pd.damagedata.addCalculatedActualDamage(val);
pd.damagedata.addCalculatedTotalDamage(reducedval);
}
}

View File

@ -13,6 +13,7 @@ import org.bukkit.block.banner.Pattern;
import org.bukkit.block.banner.PatternType;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Guardian;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Monster;
import org.bukkit.entity.Skeleton;
@ -65,7 +66,7 @@ public class MonsterController {
} else {
if (isZombieLeader(ent)) {
Monster m = (Monster)ent;
m.setCustomName(ChatColor.WHITE+"Zombie Leader");
SetupCustomName("",m);
}
return true;
}
@ -78,7 +79,7 @@ public class MonsterController {
} else {
if (isZombieLeader(ent)) {
Monster m = (Monster)ent;
m.setCustomName(ChatColor.WHITE+"Zombie Leader");
SetupCustomName("",m);
}
return true;
}
@ -92,7 +93,7 @@ public class MonsterController {
} else {
if (isZombieLeader(ent)) {
Monster m = (Monster)ent;
m.setCustomName(ChatColor.WHITE+"Zombie Leader");
SetupCustomName("",m);
}
return true;
}
@ -515,7 +516,7 @@ public class MonsterController {
(
(md==MonsterDifficulty.NORMAL && ent.getMaxHealth()>20) ||
(md==MonsterDifficulty.DANGEROUS && ent.getMaxHealth()>20*2) ||
(md==MonsterDifficulty.DEADLY && ent.getMaxHealth()>20*2) ||
(md==MonsterDifficulty.DEADLY && ent.getMaxHealth()>20*3) ||
(md==MonsterDifficulty.HELLFIRE && ent.getMaxHealth()>20*4)
)
{
@ -560,11 +561,27 @@ public class MonsterController {
}
}
public static void SetupCustomName(String prefix, Monster m) {
String MonsterName = m.getType().toString().toLowerCase();
if (m.getType()==EntityType.SKELETON) {
Skeleton ss = (Skeleton)m;
if (ss.getSkeletonType()==SkeletonType.WITHER) {
MonsterName = "wither skeleton";
}
}
if (m.getType()==EntityType.GUARDIAN) {
Guardian gg = (Guardian)m;
if (gg.isElder()) {
MonsterName = "guardian boss";
}
}
m.setCustomName(prefix.equalsIgnoreCase("")?"":(prefix+" ")+GenericFunctions.CapitalizeFirstLetters(MonsterName.replaceAll("_", " ")+(isZombieLeader(m)?" Leader":"")));
}
public static Monster convertMonster(Monster m, MonsterDifficulty md) {
switch (md) {
case DANGEROUS: {
String MonsterName = m.getType().toString().toLowerCase();
m.setCustomName(ChatColor.DARK_AQUA+"Dangerous "+GenericFunctions.CapitalizeFirstLetters(MonsterName.replaceAll("_", " ")+(isZombieLeader(m)?" Leader":"")));
SetupCustomName(ChatColor.DARK_AQUA+"Dangerous",m);
m.setMaxHealth(m.getMaxHealth()*2.0);
m.setHealth(m.getMaxHealth());
if (isAllowedToEquipItems(m)) {
@ -576,11 +593,13 @@ public class MonsterController {
m.setMaxHealth(20);
m.setHealth(m.getMaxHealth());
}
if (!GenericFunctions.isArmoredMob(m)) {
m.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE,Integer.MAX_VALUE,1));
}
}break;
case DEADLY: {
String MonsterName = m.getType().toString().toLowerCase();
m.setCustomName(ChatColor.GOLD+"Deadly "+GenericFunctions.CapitalizeFirstLetters(MonsterName.replaceAll("_", " ")+(isZombieLeader(m)?" Leader":"")));
m.setMaxHealth(m.getMaxHealth()*2.0);
SetupCustomName(ChatColor.GOLD+"Deadly",m);
m.setMaxHealth(m.getMaxHealth()*3.0);
m.setHealth(m.getMaxHealth());
if (isAllowedToEquipItems(m)) {
m.getEquipment().clear();
@ -592,10 +611,12 @@ public class MonsterController {
m.setMaxHealth(50);
m.setHealth(m.getMaxHealth());
}
if (!GenericFunctions.isArmoredMob(m)) {
m.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE,Integer.MAX_VALUE,3));
}
}break;
case HELLFIRE:{
String MonsterName = m.getType().toString().toLowerCase();
m.setCustomName(ChatColor.DARK_RED+"Hellfire "+GenericFunctions.CapitalizeFirstLetters(MonsterName.replaceAll("_", " ")+(isZombieLeader(m)?" Leader":"")));
SetupCustomName(ChatColor.DARK_RED+"Hellfire",m);
//m.setCustomName(ChatColor.DARK_AQUA+"Dangerous Mob");
//m.setCustomNameVisible(true);
m.setMaxHealth(m.getMaxHealth()*4.0);
@ -615,15 +636,16 @@ public class MonsterController {
m.setMaxHealth(200);
m.setHealth(m.getMaxHealth());
}
if (!GenericFunctions.isArmoredMob(m)) {
m.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE,Integer.MAX_VALUE,5));
}
}break;
default: {
if (isAllowedToEquipItems(m)) {
m.getEquipment().clear();
RandomizeEquipment(m,0);
}
if (isZombieLeader(m)) {
m.setCustomName(ChatColor.WHITE+"Zombie Leader");
}
SetupCustomName("",m);
if(isZombieLeader(m))
{
m.setMaxHealth(40);
@ -693,4 +715,24 @@ public class MonsterController {
Monster m = (Monster)loc.getWorld().spawnEntity(loc, et);
return MonsterController.convertMonster(m);
}
public static boolean isChargeZombie(Monster m) {
if (m.getType()==EntityType.ZOMBIE &&
MonsterController.getMonsterDifficulty((Monster)m)==MonsterDifficulty.HELLFIRE &&
!TwosideKeeper.chargezombies.contains((Monster)m)) {
return true;
}
return false;
}
public static boolean isUndead(Monster m) {
if (m.getType()==EntityType.ZOMBIE ||
m.getType()==EntityType.PIG_ZOMBIE ||
m.getType()==EntityType.GIANT ||
m.getType()==EntityType.SKELETON
) {
return true;
}
return false;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -3,6 +3,7 @@ package sig.plugin.TwosideKeeper;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.bukkit.Bukkit;
@ -18,6 +19,8 @@ import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
import sig.plugin.TwosideKeeper.Logging.DamageLogger;
/*PLAYER STRUCTURE
*
* Keeps external data and info about the player
@ -64,11 +67,16 @@ public class PlayerStructure {
public int nextarrowxp = 0; //How much bonus XP to give to an Artifact Bow.
public boolean hasfullrangerset=false;
public double lastarrowpower=0;
public boolean lastarrowwasinrangermode=false; //true is ranger mode.
public int headshotcombo=0;
public List<ItemCubeWindow> openeditemcube;
public boolean openinginventory=false;
public boolean fulldodge=false;
public long last_dodge=TwosideKeeper.getServerTickTime();
public long last_laugh_time=TwosideKeeper.getServerTickTime();
public long last_rejuvenate=TwosideKeeper.getServerTickTime();
public DamageLogger damagedata;
public boolean damagelogging=false;
public double prev_weapondmg=0.0;
public double prev_buffdmg=0.0;
@ -76,6 +84,8 @@ public class PlayerStructure {
public double prev_armordef=0.0;
public int debuffcount=0;
public boolean isViewingInventory=false;
public boolean destroyedminecart=false;
//Needs the instance of the player object to get all other info. Only to be called at the beginning.
public PlayerStructure(Player p, long serverTickTime) {
@ -114,10 +124,17 @@ public class PlayerStructure {
this.openinginventory = false;
this.fulldodge=false;
this.last_dodge=TwosideKeeper.getServerTickTime();
this.lastarrowwasinrangermode=false;
this.isViewingInventory=false;
this.destroyedminecart=false;
this.last_laugh_time=TwosideKeeper.getServerTickTime();
this.last_rejuvenate=TwosideKeeper.getServerTickTime();
this.damagedata = new DamageLogger(p);
this.damagelogging=false;
//Set defaults first, in case this is a new user.
setDefaultCooldowns(p);
loadConfig();
p.getInventory().addItem(new ItemStack(Material.PORTAL));
p.getInventory().addItem(new ItemStack(Material.PORTAL));
//Check if new player.
if (this.firstjoined == serverTickTime) {
@ -149,6 +166,27 @@ public class PlayerStructure {
}
}
private void setDefaultCooldowns(Player p) {
aPlugin.API.sendCooldownPacket(p, Material.BOW, TwosideKeeper.DODGE_COOLDOWN);
aPlugin.API.sendCooldownPacket(p, Material.BOW, TwosideKeeper.DODGE_COOLDOWN);
applyCooldownToAllTypes(p,"HOE",TwosideKeeper.DEATHMARK_COOLDOWN);
applyCooldownToAllTypes(p,"HOE",TwosideKeeper.DEATHMARK_COOLDOWN);
applyCooldownToAllTypes(p,"SPADE",TwosideKeeper.EARTHWAVE_COOLDOWN);
applyCooldownToAllTypes(p,"SPADE",TwosideKeeper.EARTHWAVE_COOLDOWN);
applyCooldownToAllTypes(p,"SWORD",TwosideKeeper.LINEDRIVE_COOLDOWN);
applyCooldownToAllTypes(p,"SWORD",TwosideKeeper.LINEDRIVE_COOLDOWN);
aPlugin.API.sendCooldownPacket(p, Material.SHIELD, TwosideKeeper.REJUVENATE_COOLDOWN);
aPlugin.API.sendCooldownPacket(p, Material.SHIELD, TwosideKeeper.REJUVENATE_COOLDOWN);
}
private void applyCooldownToAllTypes(Player p, String item, int cooldown) {
aPlugin.API.sendCooldownPacket(p, Material.valueOf("WOOD_"+item), cooldown);
aPlugin.API.sendCooldownPacket(p, Material.valueOf("IRON_"+item), cooldown);
aPlugin.API.sendCooldownPacket(p, Material.valueOf("STONE_"+item), cooldown);
aPlugin.API.sendCooldownPacket(p, Material.valueOf("DIAMOND_"+item), cooldown);
aPlugin.API.sendCooldownPacket(p, Material.valueOf("GOLD_"+item), cooldown);
}
//Save the configuration.
public void saveConfig() {
File config;
@ -218,4 +256,13 @@ public class PlayerStructure {
e.printStackTrace();
}
}
public static PlayerStructure GetPlayerStructure(Player p) {
if (TwosideKeeper.playerdata.containsKey(p.getUniqueId())) {
return TwosideKeeper.playerdata.get(p.getUniqueId());
} else {
TwosideKeeper.log(ChatColor.DARK_RED+"[ERROR] Player Structure for player "+p.getName()+" was not initialized! Now creating one...",0);
return TwosideKeeper.playerdata.put(p.getUniqueId(), new PlayerStructure(p,TwosideKeeper.getServerTickTime()));
}
}
}

View File

@ -9,6 +9,7 @@ import java.util.Vector;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.inventory.ItemStack;
@ -98,4 +99,8 @@ public class RecyclingCenter {
e.printStackTrace();
}
}
public static boolean isRecyclingCenter(Block b) {
return TwosideKeeper.TwosideRecyclingCenter.nodes.contains(new Location(b.getWorld(),b.getLocation().getBlockX(),b.getLocation().getBlockY(),b.getLocation().getBlockZ()));
}
}

File diff suppressed because it is too large Load Diff

View File

@ -4,6 +4,7 @@ import java.util.List;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Monster;
@ -16,6 +17,7 @@ import sig.plugin.TwosideKeeper.HelperStructures.Loot;
import sig.plugin.TwosideKeeper.HelperStructures.MonsterDifficulty;
import sig.plugin.TwosideKeeper.HelperStructures.MonsterType;
import sig.plugin.TwosideKeeper.HelperStructures.ServerType;
import sig.plugin.TwosideKeeper.HelperStructures.WorldShop;
import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions;
public final class TwosideKeeperAPI {
@ -157,6 +159,16 @@ public final class TwosideKeeperAPI {
return SpleefManager.playerIsPlayingSpleef(p);
}
//World Shop COMMANDS.
public static boolean isWorldShop(Location l) {
return WorldShop.shopSignExists(l);
}
//Recycling Center COMMANDS.
public static boolean isRecyclingCenter(Block b) {
return RecyclingCenter.isRecyclingCenter(b);
}
//Localization COMMANDS.
public static String getLocalizedItemName(ItemStack i) {
return GenericFunctions.UserFriendlyMaterialName(i);
@ -167,4 +179,9 @@ public final class TwosideKeeperAPI {
public static String getLocalizedItemName(Material i, byte data) {
return GenericFunctions.UserFriendlyMaterialName(i,data);
}
//Player COMMANDS.
public static double getPlayerVelocity(Player p) {
return GenericFunctions.GetPlayerVelocity(p);
}
}

View File

@ -9,6 +9,7 @@ import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.block.Chest;
import org.bukkit.block.Sign;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
@ -216,11 +217,11 @@ public class WorldShopManager {
sessions.remove(ss);
}
public void AddNewPurchase(String owner, Player purchaser, int shopID, double price, int amt) {
purchases.add(new ShopPurchase(owner, purchaser, shopID, price, amt));
public void AddNewPurchase(String owner, Player purchaser, ItemStack item, double price, int amt) {
purchases.add(new ShopPurchase(owner, purchaser, item, price, amt));
}
public void AddNewPurchase(String owner, Player purchaser, int shopID, double price, int amt, boolean sell) {
purchases.add(new ShopPurchase(owner, purchaser, shopID, price, amt, sell));
public void AddNewPurchase(String owner, Player purchaser, ItemStack item, double price, int amt, boolean sell) {
purchases.add(new ShopPurchase(owner, purchaser, item, price, amt, sell));
}
public boolean PlayerHasPurchases(Player p) {
for (int i=0;i<purchases.size();i++) {
@ -240,6 +241,33 @@ public class WorldShopManager {
}
}
public WorldShop SetupNextItemShop(WorldShop shop, Chest shopchest, final Sign s) {
boolean founditem=false;
final WorldShop oldshop = new WorldShop(shop.GetItem().clone(), shop.GetAmount(), shop.GetStoredAmount(), shop.GetUnitPrice(), shop.GetOwner(), shop.getID());
if (shop.GetAmount()==0) {
TwosideKeeper.log("Amount is 0. Proceed to look for next item.", 5);
for (int i=0;i<shopchest.getInventory().getSize();i++) {
if (shopchest.getInventory().getItem(i)!=null &&
shopchest.getInventory().getItem(i).getType()!=Material.AIR) {
//Use this as the next world shop.
TwosideKeeper.log("Found item for slot "+i, 5);
shop.UpdateItem(shopchest.getInventory().getItem(i));
shop.UpdateAmount(GenericFunctions.CountItems(shopchest.getInventory(), shopchest.getInventory().getItem(i)));
founditem=true;
break;
}
}
}
final WorldShop sh = shop;
Bukkit.getScheduler().scheduleSyncDelayedTask(Bukkit.getPluginManager().getPlugin("TwosideKeeper"), new Runnable() {
@Override
public void run() {
sh.removeShopItem(s, oldshop);
sh.spawnShopItem(s.getLocation(), sh);
}},1);
return shop;
}
public void Cleanup() {
//Removes all shop sessions.
sessions.clear();