Determine whether Ice Prison target is valid. Fixes PC-281
This commit is contained in:
parent
1497662b2e
commit
1fc4239b89
@ -325,6 +325,14 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
|
||||
skillManager.RemoveSkill("Dwarf Toss", "Block Toss");
|
||||
skillManager.removeSkill("Whirlwind Axe");
|
||||
skillManager.removeSkill("Shield Smash");
|
||||
// Check if any Ice Prison blocks will be placed inside a safe zone
|
||||
// fixme Is there any way of checking the destination beforehand?
|
||||
// Although if the user is trying to launch an Ice Prison into a safezone they should know better
|
||||
skillManager.GetSkill("Ice Prison").setLocationFilter(location ->
|
||||
{
|
||||
ClanTerritory territory = _clanUtility.getClaim(location);
|
||||
return territory == null || !territory.Safe;
|
||||
});
|
||||
|
||||
_worldEvent.setFactory(skillManager);
|
||||
_classManager = new ClassManager(plugin, _clientManager, donationManager, skillManager, itemFactory, webServerAddress);
|
||||
|
@ -39,4 +39,7 @@ public interface ISkill
|
||||
int getMaxLevel();
|
||||
|
||||
boolean isAchievementSkill();
|
||||
|
||||
void setLocationFilter(LocationFilter locationFilter);
|
||||
LocationFilter getLocationFilter();
|
||||
}
|
||||
|
@ -0,0 +1,18 @@
|
||||
package mineplex.minecraft.game.classcombat.Skill;
|
||||
|
||||
import org.bukkit.Location;
|
||||
|
||||
/*
|
||||
* Determines whether a location is acceptable for an action to be performed
|
||||
*/
|
||||
public interface LocationFilter
|
||||
{
|
||||
LocationFilter ACCEPT_ALL = location -> true;
|
||||
|
||||
/*
|
||||
* Check if the given location is acceptable
|
||||
* @param location The location to check
|
||||
* @return Whether the location is valid, or invalid
|
||||
*/
|
||||
boolean accept(Location location);
|
||||
}
|
@ -1,6 +1,8 @@
|
||||
package mineplex.minecraft.game.classcombat.Skill.Mage;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.bukkit.Effect;
|
||||
import org.bukkit.Material;
|
||||
@ -118,6 +120,9 @@ public class IcePrison extends SkillActive implements IThrown
|
||||
|
||||
//Sphere
|
||||
HashMap<Block, Double> blocks = UtilBlock.getInRadius(block, 3.8d);
|
||||
// To save having to calculate everything again
|
||||
Set<Block> acceptable = new HashSet<>();
|
||||
boolean failed = false;
|
||||
for (Block cur : blocks.keySet())
|
||||
{
|
||||
if (!UtilBlock.airFoliage(cur))
|
||||
@ -129,8 +134,28 @@ public class IcePrison extends SkillActive implements IThrown
|
||||
//Leave roof hole
|
||||
if (cur.getX() == block.getX() && cur.getZ() == block.getZ() && cur.getY() > block.getY())
|
||||
continue;
|
||||
|
||||
FreezeBlock(cur, block, level);
|
||||
|
||||
if (getLocationFilter().accept(cur.getLocation()))
|
||||
{
|
||||
acceptable.add(cur);
|
||||
}
|
||||
else
|
||||
{
|
||||
failed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!failed)
|
||||
{
|
||||
for (Block cur : acceptable)
|
||||
{
|
||||
FreezeBlock(cur, block, level);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UtilPlayer.message(player, F.main("Skill", "You cannot use " + F.skill(GetName()) + " here."));
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -12,7 +12,6 @@ import mineplex.core.common.util.UtilTextBottom;
|
||||
import mineplex.minecraft.game.classcombat.Class.IPvpClass.ClassType;
|
||||
import mineplex.minecraft.game.classcombat.Skill.repository.token.SkillToken;
|
||||
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.Entity;
|
||||
@ -43,6 +42,8 @@ public abstract class Skill implements ISkill, Listener
|
||||
|
||||
private boolean _isAchievementSkill = false;
|
||||
|
||||
private LocationFilter _locationFilter = LocationFilter.ACCEPT_ALL;
|
||||
|
||||
public SkillFactory Factory;
|
||||
|
||||
public Skill(SkillFactory skills, String name, ClassType classType, SkillType skillType, int cost, int maxLevel)
|
||||
@ -357,4 +358,16 @@ public abstract class Skill implements ISkill, Listener
|
||||
{
|
||||
return _isAchievementSkill;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLocationFilter(LocationFilter filter)
|
||||
{
|
||||
this._locationFilter = filter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LocationFilter getLocationFilter()
|
||||
{
|
||||
return this._locationFilter;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user