浏览代码

Less aggressive detection

nossr50 6 年之前
父节点
当前提交
bb118607ce

+ 19 - 4
src/main/java/com/gmail/nossr50/listeners/PlayerListener.java

@@ -37,6 +37,7 @@ import org.bukkit.entity.*;
 import org.bukkit.event.EventHandler;
 import org.bukkit.event.EventPriority;
 import org.bukkit.event.Listener;
+import org.bukkit.event.block.Action;
 import org.bukkit.event.entity.EntityPickupItemEvent;
 import org.bukkit.event.entity.PlayerDeathEvent;
 import org.bukkit.event.player.*;
@@ -322,11 +323,16 @@ public class PlayerListener implements Listener {
         Entity caught = event.getCaught();
         FishingManager fishingManager = UserManager.getPlayer(player).getFishingManager();
 
-        //Fishing Too Often
-        if(event.getState() != PlayerFishEvent.State.CAUGHT_ENTITY && fishingManager.isFishingTooOften())
+        //Track the hook
+        if(event.getHook().getMetadata(mcMMO.FISH_HOOK_REF_METAKEY).size() == 0)
+        {
+            fishingManager.setFishHookReference(event.getHook());
+        }
+
+        //Spam Fishing
+        if(event.getState() == PlayerFishEvent.State.CAUGHT_FISH && fishingManager.isFishingTooOften())
         {
             event.setExpToDrop(0);
-            event.setCancelled(true);
 
             if(caught instanceof Item)
             {
@@ -348,7 +354,6 @@ public class PlayerListener implements Listener {
                 if(fishingManager.isExploitingFishing(event.getHook().getLocation().toVector()))
                 {
                     event.setExpToDrop(0);
-                    event.setCancelled(true);
                     Item caughtItem = (Item) caught;
                     caughtItem.remove();
                     return;
@@ -356,6 +361,7 @@ public class PlayerListener implements Listener {
 
                 fishingManager.handleFishing((Item) caught);
                 fishingManager.setFishingTarget();
+                //fishingManager.setFishHookReference(null);
                 return;
             case CAUGHT_ENTITY:
                 if (fishingManager.canShake(caught)) {
@@ -631,6 +637,15 @@ public class PlayerListener implements Listener {
         McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
         ItemStack heldItem = player.getInventory().getItemInMainHand();
 
+        //Spam Fishing Detection
+        if(event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_AIR)
+        {
+            if(heldItem.getType() == Material.FISHING_ROD || player.getInventory().getItemInOffHand().getType() == Material.FISHING_ROD)
+            {
+                mcMMOPlayer.getFishingManager().setFishingRodCastTimestamp();
+            }
+        }
+
         switch (event.getAction()) {
             case RIGHT_CLICK_BLOCK:
                 if(player.getInventory().getItemInOffHand().getType() != Material.AIR && !player.isInsideVehicle() && !player.isSneaking()) {

+ 1 - 0
src/main/java/com/gmail/nossr50/mcMMO.java

@@ -96,6 +96,7 @@ public class mcMMO extends JavaPlugin {
     private static boolean isRetroModeEnabled;
 
     /* Metadata Values */
+    public static final String FISH_HOOK_REF_METAKEY = "mcMMO: Fish Hook Tracker";
     public final static String entityMetadataKey   = "mcMMO: Spawned Entity";
     public final static String blockMetadataKey    = "mcMMO: Piston Tracking";
     public final static String furnaceMetadataKey  = "mcMMO: Tracked Furnace";

+ 38 - 9
src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java

@@ -16,6 +16,7 @@ import com.gmail.nossr50.datatypes.treasure.ShakeTreasure;
 import com.gmail.nossr50.events.skills.fishing.McMMOPlayerFishingTreasureEvent;
 import com.gmail.nossr50.events.skills.fishing.McMMOPlayerShakeEvent;
 import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.util.*;
 import com.gmail.nossr50.util.player.NotificationManager;
@@ -43,8 +44,10 @@ import java.util.*;
 public class FishingManager extends SkillManager {
     private final long FISHING_COOLDOWN_SECONDS = 1000L;
 
-    private long fishingTimestamp = 0L;
+    private long fishingRodCastTimestamp = 0L;
+    private long fishHookSpawnTimestamp = 0L;
     private long lastWarned = 0L;
+    private FishHook fishHookReference;
     private BoundingBox lastFishingBoundingBox;
     private Item fishingCatch;
     private Location hookLocation;
@@ -61,19 +64,48 @@ public class FishingManager extends SkillManager {
         return getSkillLevel() >= RankUtils.getUnlockLevel(SubSkillType.FISHING_MASTER_ANGLER) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.FISHING_MASTER_ANGLER);
     }
 
+    public void setFishingRodCastTimestamp()
+    {
+        //Only track spam casting if the fishing hook is fresh
+        if(System.currentTimeMillis() > fishHookSpawnTimestamp + 500)
+            return;
+
+        if(System.currentTimeMillis() < fishingRodCastTimestamp + 300)
+        {
+            getPlayer().setFoodLevel(Math.min(getPlayer().getFoodLevel() - 1, 0));
+            getPlayer().getInventory().getItemInMainHand().setDurability((short) (getPlayer().getInventory().getItemInMainHand().getDurability() + 5));
+            getPlayer().updateInventory();
+            getPlayer().sendMessage(LocaleLoader.getString("Fishing.Exhausting"));
+
+        }
+
+        fishingRodCastTimestamp = System.currentTimeMillis();
+    }
+
+    public void setFishHookReference(FishHook fishHook)
+    {
+        if(fishHook.getMetadata(mcMMO.FISH_HOOK_REF_METAKEY).size() > 0)
+            return;
+
+        fishHook.setMetadata(mcMMO.FISH_HOOK_REF_METAKEY, mcMMO.metadataValue);
+        this.fishHookReference = fishHook;
+        fishHookSpawnTimestamp = System.currentTimeMillis();
+        fishingRodCastTimestamp = System.currentTimeMillis();
+
+    }
+
     public boolean isFishingTooOften()
     {
         long currentTime = System.currentTimeMillis();
-        boolean hasFished = (currentTime < fishingTimestamp + (FISHING_COOLDOWN_SECONDS * 10));
+        long fishHookSpawnCD = fishHookSpawnTimestamp + 1000;
+        boolean hasFished = (currentTime < fishHookSpawnCD);
 
-        if(hasFished && lastWarned + (1000 * 5) < System.currentTimeMillis())
+        if(hasFished && (lastWarned + (1000 * 1) < currentTime))
         {
             getPlayer().sendMessage(LocaleLoader.getString("Fishing.Scared"));
             lastWarned = System.currentTimeMillis();
         }
 
-        fishingTimestamp = currentTime;
-
         return hasFished;
     }
 
@@ -85,12 +117,9 @@ public class FishingManager extends SkillManager {
             return false;
         }*/
 
-        if(lastFishingBoundingBox == null)
-            lastFishingBoundingBox = makeBoundingBox(centerOfCastVector);
-
         BoundingBox newCastBoundingBox = makeBoundingBox(centerOfCastVector);
 
-        boolean sameTarget = lastFishingBoundingBox.overlaps(newCastBoundingBox);
+        boolean sameTarget = lastFishingBoundingBox != null && lastFishingBoundingBox.overlaps(newCastBoundingBox);
 
         //If the new bounding box does not intersect with the old one, then update our bounding box reference
         if(!sameTarget)

+ 1 - 0
src/main/resources/locale/locale_en_US.properties

@@ -219,6 +219,7 @@ Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used
 #FISHING
 Fishing.Scarcity=[[YELLOW]]&oThis area is suffering from overfishing, try fishing in a new area.
 Fishing.Scared=[[GRAY]]&oChaotic movements will scare fish!
+Fishing.Exhausting=[[RED]]&oImproper use of the fishing rod will cause fatigue and wear out the rod!
 Fishing.Ability.Info=Magic Hunter: [[GRAY]] **Improves With Treasure Hunter Rank**
 Fishing.Ability.Locked.0=LOCKED UNTIL {0}+ SKILL (SHAKE)
 Fishing.Ability.Locked.1=LOCKED UNTIL {0}+ SKILL (ICE FISHING)