mirror of
				https://github.com/mcMMO-Dev/mcMMO.git
				synced 2025-11-03 18:43:43 +01:00 
			
		
		
		
	Merge branch 'master' of github.com:mcMMO-Dev/mcMMO
This commit is contained in:
		@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.google.common.collect.HashMultiset;
 | 
				
			||||||
 | 
					import org.bukkit.Location;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.LinkedList;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * This class works with the assumption that you only pass in Block Locations.  If locations have differing pitch/yaw, the logic breaks
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class BlockLocationHistory {
 | 
				
			||||||
 | 
					    private final LinkedList<Location> limitedSizeOrderedList = new LinkedList<>();
 | 
				
			||||||
 | 
					    private final HashMultiset<Location> lookup = HashMultiset.create();
 | 
				
			||||||
 | 
					    private final int maxSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public BlockLocationHistory(int maxSize) {
 | 
				
			||||||
 | 
					        this.maxSize = maxSize;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Adds a block location to the history.  If the history memory would exceed the max size, it will remove the least recently added block location
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param newItem
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void add(Location newItem) {
 | 
				
			||||||
 | 
					        limitedSizeOrderedList.addFirst(newItem);
 | 
				
			||||||
 | 
					        lookup.add(newItem);
 | 
				
			||||||
 | 
					        if (limitedSizeOrderedList.size() > maxSize)
 | 
				
			||||||
 | 
					            lookup.remove(limitedSizeOrderedList.removeLast());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns true if the block location is in the recorded history
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param targetLoc the block location to search for
 | 
				
			||||||
 | 
					     * @return true if the block location is in the recorded history
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public boolean contains(Location targetLoc) {
 | 
				
			||||||
 | 
					        return lookup.contains(targetLoc);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,57 +0,0 @@
 | 
				
			|||||||
package com.gmail.nossr50.datatypes;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import org.bukkit.Location;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
public class LimitedSizeList {
 | 
					 | 
				
			||||||
    public Location[] limitedSizeOrderedList;
 | 
					 | 
				
			||||||
    private final int size;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public LimitedSizeList(int size)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        this.size = size;
 | 
					 | 
				
			||||||
        limitedSizeOrderedList = new Location[size];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Adds objects to our limited size ordered list
 | 
					 | 
				
			||||||
     * New objects are added to the front
 | 
					 | 
				
			||||||
     * @param newItem
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public void add(Location newItem)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        Location[] newList = new Location[size];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for(int i = 0; i < size-1; i++)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            if(i != 0)
 | 
					 | 
				
			||||||
                newList[i] = limitedSizeOrderedList[i-1];
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
                newList[i] = newItem;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        limitedSizeOrderedList = newList;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * Returns true if the object is anywhere in our list
 | 
					 | 
				
			||||||
     * @param targetLoc the object to check for
 | 
					 | 
				
			||||||
     * @return true if the object is in our list
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    public boolean contains(Location targetLoc)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        for(Location iter : limitedSizeOrderedList)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            if(iter == null)
 | 
					 | 
				
			||||||
                continue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if(iter.getX() == targetLoc.getX()
 | 
					 | 
				
			||||||
                    && iter.getY() == targetLoc.getY()
 | 
					 | 
				
			||||||
                    && iter.getZ() == targetLoc.getZ())
 | 
					 | 
				
			||||||
                return true;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
package com.gmail.nossr50.skills.acrobatics;
 | 
					package com.gmail.nossr50.skills.acrobatics;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.gmail.nossr50.config.experience.ExperienceConfig;
 | 
					import com.gmail.nossr50.config.experience.ExperienceConfig;
 | 
				
			||||||
import com.gmail.nossr50.datatypes.LimitedSizeList;
 | 
					import com.gmail.nossr50.datatypes.BlockLocationHistory;
 | 
				
			||||||
import com.gmail.nossr50.datatypes.experience.XPGainReason;
 | 
					import com.gmail.nossr50.datatypes.experience.XPGainReason;
 | 
				
			||||||
import com.gmail.nossr50.datatypes.interactions.NotificationType;
 | 
					import com.gmail.nossr50.datatypes.interactions.NotificationType;
 | 
				
			||||||
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 | 
					import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 | 
				
			||||||
@@ -28,13 +28,13 @@ public class AcrobaticsManager extends SkillManager {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public AcrobaticsManager(McMMOPlayer mcMMOPlayer) {
 | 
					    public AcrobaticsManager(McMMOPlayer mcMMOPlayer) {
 | 
				
			||||||
        super(mcMMOPlayer, PrimarySkillType.ACROBATICS);
 | 
					        super(mcMMOPlayer, PrimarySkillType.ACROBATICS);
 | 
				
			||||||
        fallLocationMap = new LimitedSizeList(50);
 | 
					        fallLocationMap = new BlockLocationHistory(50);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private long rollXPCooldown = 0;
 | 
					    private long rollXPCooldown = 0;
 | 
				
			||||||
    private final long rollXPInterval = (1000 * 3); //1 Minute
 | 
					    private final long rollXPInterval = (1000 * 3); //1 Minute
 | 
				
			||||||
    private long rollXPIntervalLengthen = (1000 * 10); //10 Seconds
 | 
					    private long rollXPIntervalLengthen = (1000 * 10); //10 Seconds
 | 
				
			||||||
    private final LimitedSizeList fallLocationMap;
 | 
					    private final BlockLocationHistory fallLocationMap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public boolean hasFallenInLocationBefore(Location location)
 | 
					    public boolean hasFallenInLocationBefore(Location location)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					package com.gmail.nossr50.datatypes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.bukkit.Location;
 | 
				
			||||||
 | 
					import org.junit.Assert;
 | 
				
			||||||
 | 
					import org.junit.Test;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class BlockLocationHistoryTest {
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    public void testRemovesOldestElement() {
 | 
				
			||||||
 | 
					        BlockLocationHistory history = new BlockLocationHistory(2);
 | 
				
			||||||
 | 
					        Location locationA = new Location(null, 0, 1, 2);
 | 
				
			||||||
 | 
					        Location locationB = new Location(null, 1, 2, 3);
 | 
				
			||||||
 | 
					        Location locationC = new Location(null, 2, 3, 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        history.add(locationA);
 | 
				
			||||||
 | 
					        history.add(locationB);
 | 
				
			||||||
 | 
					        history.add(locationC);
 | 
				
			||||||
 | 
					        Assert.assertFalse(history.contains(locationA));
 | 
				
			||||||
 | 
					        Assert.assertTrue(history.contains(locationB));
 | 
				
			||||||
 | 
					        Assert.assertTrue(history.contains(locationC));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    public void testSupportsDuplicateElement() {
 | 
				
			||||||
 | 
					        BlockLocationHistory history = new BlockLocationHistory(2);
 | 
				
			||||||
 | 
					        Location locationA = new Location(null, 0, 1, 2);
 | 
				
			||||||
 | 
					        Location locationB = new Location(null, 1, 2, 3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        history.add(locationA);
 | 
				
			||||||
 | 
					        history.add(locationA);
 | 
				
			||||||
 | 
					        history.add(locationB);
 | 
				
			||||||
 | 
					        Assert.assertTrue(history.contains(locationA));
 | 
				
			||||||
 | 
					        Assert.assertTrue(history.contains(locationB));
 | 
				
			||||||
 | 
					        history.add(locationB);
 | 
				
			||||||
 | 
					        Assert.assertFalse(history.contains(locationA));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,10 +1,10 @@
 | 
				
			|||||||
import com.gmail.nossr50.util.blockmeta.*;
 | 
					package com.gmail.nossr50.util.blockmeta;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.google.common.io.Files;
 | 
					import com.google.common.io.Files;
 | 
				
			||||||
import org.bukkit.Bukkit;
 | 
					import org.bukkit.Bukkit;
 | 
				
			||||||
import org.bukkit.World;
 | 
					import org.bukkit.World;
 | 
				
			||||||
import org.bukkit.block.Block;
 | 
					import org.bukkit.block.Block;
 | 
				
			||||||
import org.jetbrains.annotations.NotNull;
 | 
					import org.jetbrains.annotations.NotNull;
 | 
				
			||||||
import org.jetbrains.annotations.Nullable;
 | 
					 | 
				
			||||||
import org.junit.*;
 | 
					import org.junit.*;
 | 
				
			||||||
import org.junit.runner.RunWith;
 | 
					import org.junit.runner.RunWith;
 | 
				
			||||||
import org.mockito.Mockito;
 | 
					import org.mockito.Mockito;
 | 
				
			||||||
		Reference in New Issue
	
	Block a user