/*
* This file is part of NucleusFramework for Bukkit, licensed under the MIT License (MIT).
*
* Copyright (c) JCThePants (www.jcwhatever.com)
*
* 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 com.jcwhatever.nucleus.internal.managed.nms;
import net.minecraft.server.v1_9_R1.DataWatcher;
import net.minecraft.server.v1_9_R1.DataWatcherObject;
import net.minecraft.server.v1_9_R1.DataWatcherRegistry;
import net.minecraft.server.v1_9_R1.EntityLiving;
import org.bukkit.craftbukkit.v1_9_R1.entity.CraftEntity;
import org.bukkit.entity.Entity;
/**
* Data watcher wrapper
*/
public class v1_9_R1_DataWatcher extends DataWatcher implements IDataWatcher {
private static final DataWatcherObject<Byte> ENTITY_FLAGS = DataWatcher.a(net.minecraft.server.v1_9_R1.Entity.class, DataWatcherRegistry.a);
private static final DataWatcherObject<Integer> ARROW_STICK = DataWatcher.a(EntityLiving.class, DataWatcherRegistry.b);
private static final byte SNEAK_FLAG = 1 << 1;
private final DataWatcher _watcher;
private boolean _canDismount;
private boolean _isDismountPressed = false;
private boolean _canArrowsStick = true;
public v1_9_R1_DataWatcher(Entity entity) {
super(null);
_watcher = ((CraftEntity) entity).getHandle().getDataWatcher();
_isDismountPressed = getFlag(1);
}
@Override
public boolean canDismount() {
return _canDismount;
}
@Override
public void setCanDismount(boolean canDismount) {
if (!canDismount) {
if(getFlag(1)) { // isSneaking
setDismountPressed(false);
}
}
_canDismount = canDismount;
}
@Override
public boolean isDismountPressed() {
return _isDismountPressed;
}
@Override
public void setDismountPressed(boolean isPressed) {
_isDismountPressed = isPressed;
if (_canDismount) {
setFlag(1, isPressed);
}
}
public void setFlag(int i, boolean flag) {
byte b0 = get(ENTITY_FLAGS);
if (flag) {
_watcher.set(ENTITY_FLAGS, (byte) (b0 | 1 << i));
} else {
_watcher.set(ENTITY_FLAGS, (byte) (b0 & ~(1 << i)));
}
}
public boolean getFlag(int i) {
return (get(ENTITY_FLAGS) & 1 << i) != 0;
}
@Override
public void removeArrows() {
_watcher.set(ARROW_STICK, 0);
}
@Override
public boolean canArrowsStick() {
return _canArrowsStick;
}
@Override
public void setCanArrowsStick(boolean isAllowed) {
_canArrowsStick = isAllowed;
if (!isAllowed)
removeArrows();
}
@Override
public <T> void set(DataWatcherObject<T> i, T t0) {
if (ENTITY_FLAGS.equals(i)) {
byte newFlags = ((Number) t0).byteValue();
if ((newFlags & SNEAK_FLAG) == SNEAK_FLAG) {
_isDismountPressed = true;
if (!_canDismount)
return;
} else {
_isDismountPressed = false;
}
}
else if (ARROW_STICK.equals(i)) {
if (!_canArrowsStick && ((Number) t0).intValue() != 0)
return;
}
_watcher.set(i, t0);
}
}