Changed Tree Feller to not rely on external ArrayList

Given Bukkit's behavior of events, it would have never been possible for more than one player's data to occupy the shared arraylist... Still looked ugly, though.
Also helps toward concurrent events, should they ever come.
Also moved from a static boolean flag to a per-use flag
Also removed unused static variable "w"
This commit is contained in:
NuclearW 2012-02-19 00:54:56 -05:00
parent cca04468de
commit b08aead536
4 changed files with 22 additions and 30 deletions

View File

@ -8,8 +8,9 @@ Version 1.3.00-dev
- Added configuration option to control mcMMO reporting damage events
- Added hunger regain bonuses to Herbalism skill
- Changed chat logging for /p & /a
- Fixed Tree Feller not playing nice with NoCheat
- Fixed Tree Feller not playing nice with NoCheat (?)
- Added framework for new Blast Mining skill
- Changed Tree Feller to use per-use ArrayList
Version 1.2.12
- Fixed issue that caused terrible MySQL performance and negative XP on levelup (Issue #134)

View File

@ -33,7 +33,6 @@ public class Misc
public ArrayList<Entity> mobSpawnerList = new ArrayList<Entity>();
public HashSet<Block> blockWatchList = new HashSet<Block>();
public ArrayList<Block> treeFeller = new ArrayList<Block>();
public HashMap<Entity, Integer> arrowTracker = new HashMap<Entity, Integer>();
public ArrayList<LivingEntity> bleedTracker = new ArrayList<LivingEntity>();
public HashMap<Block, Integer> tntTracker = new HashMap<Block, Integer>();

View File

@ -16,6 +16,8 @@
*/
package com.gmail.nossr50.listeners;
import java.util.ArrayList;
import com.gmail.nossr50.Users;
import com.gmail.nossr50.m;
import com.gmail.nossr50.mcMMO;
@ -223,8 +225,8 @@ public class mcBlockListener implements Listener
PlayerAnimationEvent armswing = new PlayerAnimationEvent(player);
Bukkit.getPluginManager().callEvent(armswing);
WoodCutting.treeFeller(block, player, plugin);
for(Block blockx : plugin.misc.treeFeller)
ArrayList<Block> fell = WoodCutting.treeFeller(block, player);
for(Block blockx : fell)
{
if(blockx != null)
{
@ -262,7 +264,6 @@ public class mcBlockListener implements Listener
if(!player.getItemInHand().containsEnchantment(Enchantment.DURABILITY))
m.damageTool(player, (short) LoadProperties.abilityDurabilityLoss);
}
plugin.misc.treeFeller.clear();
}
}
/*

View File

@ -40,8 +40,6 @@ import org.getspout.spoutapi.sound.SoundEffect;
public class WoodCutting
{
static int w = 0;
private static boolean isdone = false;
public static void woodCuttingProcCheck(Player player, Block block)
{
@ -99,34 +97,29 @@ public class WoodCutting
}
}
}
public static void treeFeller(Block block, Player player, mcMMO plugin){
public static ArrayList<Block> treeFeller(Block block, Player player) {
PlayerProfile PP = Users.getProfile(player);
int radius = 1;
if(PP.getSkillLevel(SkillType.WOODCUTTING) >= 500)
radius++;
if(PP.getSkillLevel(SkillType.WOODCUTTING) >= 950)
radius++;
ArrayList<Block> blocklist = new ArrayList<Block>();
ArrayList<Block> toAdd = new ArrayList<Block>();
ArrayList<Block> blockList = new ArrayList<Block>();
ArrayList<Block> returnList = new ArrayList<Block>();
if(block != null)
blocklist.add(block);
while(isdone == false){
addBlocksToTreeFelling(blocklist, toAdd, radius);
blockList.add(block);
boolean isDone = false;
while(isDone == false){
isDone = addBlocksToTreeFelling(blockList, returnList, radius);
}
//This needs to be a hashmap too!
isdone = false;
/*
* Add blocks from the temporary 'toAdd' array list into the 'treeFeller' array list
* We use this temporary list to prevent concurrent modification exceptions
*/
for(Block x : toAdd)
{
if(!plugin.misc.treeFeller.contains(x))
plugin.misc.treeFeller.add(x);
}
toAdd.clear();
return returnList;
}
public static void addBlocksToTreeFelling(ArrayList<Block> blocklist, ArrayList<Block> toAdd, Integer radius)
public static boolean addBlocksToTreeFelling(ArrayList<Block> blocklist, ArrayList<Block> toAdd, Integer radius)
{
int u = 0;
for (Block x : blocklist)
@ -134,7 +127,6 @@ public class WoodCutting
u++;
if(toAdd.contains(x))
continue;
w = 0;
Location loc = x.getLocation();
int vx = x.getX();
int vy = x.getY();
@ -149,7 +141,6 @@ public class WoodCutting
Block blocktarget = loc.getWorld().getBlockAt(vx + cx, vy + cy, vz + cz);
if (!blocklist.contains(blocktarget) && !toAdd.contains(blocktarget) && (blocktarget.getTypeId() == 17 || blocktarget.getTypeId() == 18)) {
toAdd.add(blocktarget);
w++;
}
}
}
@ -165,9 +156,9 @@ public class WoodCutting
}
if(u >= blocklist.size())
{
isdone = true;
return true;
} else {
isdone = false;
return false;
}
}