diff --git a/bukkit/src/main/java/me/lucko/luckperms/inject/DummyPermissibleBase.java b/bukkit/src/main/java/me/lucko/luckperms/inject/DummyPermissibleBase.java new file mode 100644 index 000000000..11f8e2497 --- /dev/null +++ b/bukkit/src/main/java/me/lucko/luckperms/inject/DummyPermissibleBase.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2016 Lucko (Luck) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.inject; + +import org.bukkit.permissions.PermissibleBase; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.permissions.PermissionAttachmentInfo; +import org.bukkit.plugin.Plugin; + +import java.util.Set; + +public class DummyPermissibleBase extends PermissibleBase { + public DummyPermissibleBase() { + super(null); + } + + @Override + public boolean isOp() { + return false; + } + + @Override + public void setOp(boolean value) { + + } + + @Override + public boolean isPermissionSet(String name) { + return false; + } + + @Override + public boolean isPermissionSet(Permission perm) { + return false; + } + + @Override + public boolean hasPermission(String inName) { + return false; + } + + @Override + public boolean hasPermission(Permission perm) { + return false; + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value) { + return null; + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin) { + return null; + } + + @Override + public void removeAttachment(PermissionAttachment attachment) { + + } + + @Override + public void recalculatePermissions() { + + } + + @Override + public synchronized void clearPermissions() { + + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value, int ticks) { + return null; + } + + @Override + public PermissionAttachment addAttachment(Plugin plugin, int ticks) { + return null; + } + + @Override + public Set getEffectivePermissions() { + return null; + } +} diff --git a/bukkit/src/main/java/me/lucko/luckperms/inject/Injector.java b/bukkit/src/main/java/me/lucko/luckperms/inject/Injector.java index fbfae7df8..35ca8abc9 100644 --- a/bukkit/src/main/java/me/lucko/luckperms/inject/Injector.java +++ b/bukkit/src/main/java/me/lucko/luckperms/inject/Injector.java @@ -62,7 +62,10 @@ public class Injector { try { Permissible permissible = getPermissible(sender); if (permissible instanceof LPPermissible) { - getPermField(sender).set(sender, new PermissibleBase(sender)); + /* The player is most likely leaving. Bukkit will attempt to call #clearPermissions, so we cannot set to null. + However, there's no need to re-inject a real PermissibleBase, so we just inject a dummy instead. + This saves tick time, pointlessly recalculating defaults when the instance will never be used. */ + getPermField(sender).set(sender, new DummyPermissibleBase()); } return true; } catch (Exception e) {