/*
* 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_8_R3.DataWatcher;
import net.minecraft.server.v1_8_R3.ItemStack;
import net.minecraft.server.v1_8_R3.PacketDataSerializer;
import net.minecraft.server.v1_8_R3.Vector3f;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
import org.bukkit.entity.Entity;
import java.io.IOException;
import java.util.List;
/**
* Data watcher wrapper
*/
public class v1_8_R3_DataWatcher extends DataWatcher implements IDataWatcher {
private static final byte SNEAK_FLAG = 1 << 1;
private static final int ENTITY_FLAGS_ID = 0;
private static final int ARROW_STICK_ID = 9;
private final DataWatcher _watcher;
private boolean _canDismount;
private boolean _isDismountPressed = false;
private boolean _canArrowsStick = true;
public v1_8_R3_DataWatcher(Entity entity) {
super(null);
_watcher = ((CraftEntity)entity).getHandle().getDataWatcher();
byte flags = getByte(0);
_isDismountPressed = (flags & SNEAK_FLAG) == SNEAK_FLAG;
}
@Override
public boolean canDismount() {
return _canDismount;
}
@Override
public void setCanDismount(boolean canDismount) {
if (!canDismount) {
byte current = getByte(0);
current &= ~SNEAK_FLAG;
watch(0, current);
}
_canDismount = canDismount;
}
@Override
public boolean isDismountPressed() {
return _isDismountPressed;
}
@Override
public void setDismountPressed(boolean isPressed) {
_isDismountPressed = isPressed;
if (_canDismount) {
byte flags = getByte(0);
if (isPressed) {
flags |= SNEAK_FLAG;
}
else {
flags &= ~SNEAK_FLAG;
}
watch(0, flags);
}
}
@Override
public void removeArrows() {
_watcher.watch(ARROW_STICK_ID, (byte)0);
}
@Override
public boolean canArrowsStick() {
return _canArrowsStick;
}
@Override
public void setCanArrowsStick(boolean isAllowed) {
_canArrowsStick = isAllowed;
if (!isAllowed)
removeArrows();
}
@Override
public <T> void a(int i, T t0) {
_watcher.a(i, t0);
}
@Override
public void add(int i, int j) {
_watcher.add(i, j);
}
@Override
public byte getByte(int i) {
return _watcher.getByte(i);
}
@Override
public short getShort(int i) {
return _watcher.getShort(i);
}
@Override
public int getInt(int i) {
return _watcher.getInt(i);
}
@Override
public float getFloat(int i) {
return _watcher.getFloat(i);
}
@Override
public String getString(int i) {
return _watcher.getString(i);
}
@Override
public ItemStack getItemStack(int i) {
return _watcher.getItemStack(i);
}
@Override
public Vector3f h(int i) {
return _watcher.h(i);
}
@Override
public <T> void watch(int i, T t0) {
if (i == ENTITY_FLAGS_ID) {
byte newFlags = ((Number)t0).byteValue();
if ((newFlags & SNEAK_FLAG) == SNEAK_FLAG) {
_isDismountPressed = true;
if (!_canDismount)
return;
}
else {
_isDismountPressed = false;
}
}
else if (i == ARROW_STICK_ID) {
if (!_canArrowsStick && ((Number)t0).byteValue() != 0)
return;
}
_watcher.watch(i, t0);
}
@Override
public void update(int i) {
_watcher.update(i);
}
@Override
public boolean a() {
return _watcher.a();
}
@Override
public List<DataWatcher.WatchableObject> b() {
return _watcher.b();
}
@Override
public void a(PacketDataSerializer packetdataserializer) throws IOException {
_watcher.a(packetdataserializer);
}
@Override
public List<DataWatcher.WatchableObject> c() {
return _watcher.c();
}
@Override
public boolean d() {
return _watcher.d();
}
@Override
public void e() {
_watcher.e();
}
}