Arcturus-Community/src/main/java/com/eu/habbo/habbohotel/items/interactions/InteractionPushable.java
2020-09-13 07:25:05 +02:00

162 lines
5.8 KiB
Java

package com.eu.habbo.habbohotel.items.interactions;
import com.eu.habbo.Emulator;
import com.eu.habbo.habbohotel.gameclients.GameClient;
import com.eu.habbo.habbohotel.items.Item;
import com.eu.habbo.habbohotel.rooms.*;
import com.eu.habbo.threading.runnables.KickBallAction;
import java.sql.ResultSet;
import java.sql.SQLException;
public abstract class InteractionPushable extends InteractionDefault {
private KickBallAction currentThread;
public InteractionPushable(ResultSet set, Item baseItem) throws SQLException {
super(set, baseItem);
this.setExtradata("0");
}
public InteractionPushable(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) {
super(id, userId, item, extradata, limitedStack, limitedSells);
this.setExtradata("0");
}
@Override
public boolean canWalkOn(RoomUnit roomUnit, Room room, Object[] objects) {
return true;
}
@Override
public boolean isWalkable() {
return true;
}
@Override
public void onWalkOff(RoomUnit roomUnit, final Room room, Object[] objects) throws Exception {
super.onWalkOff(roomUnit, room, objects);
if (!(this.currentThread == null || this.currentThread.dead))
return;
int velocity = this.getWalkOffVelocity(roomUnit, room);
RoomUserRotation direction = this.getWalkOffDirection(roomUnit, room);
this.onKick(room, roomUnit, velocity, direction);
if (velocity > 0) {
if (this.currentThread != null)
this.currentThread.dead = true;
this.currentThread = new KickBallAction(this, room, roomUnit, direction, velocity, false);
Emulator.getThreading().run(this.currentThread, 0);
}
}
@Override
public void onClick(GameClient client, Room room, Object[] objects) throws Exception {
super.onClick(client, room, objects);
if (client == null) return;
if (RoomLayout.tilesAdjecent(client.getHabbo().getRoomUnit().getCurrentLocation(), room.getLayout().getTile(this.getX(), this.getY()))) {
int velocity = this.getTackleVelocity(client.getHabbo().getRoomUnit(), room);
RoomUserRotation direction = this.getWalkOnDirection(client.getHabbo().getRoomUnit(), room);
this.onTackle(room, client.getHabbo().getRoomUnit(), velocity, direction);
if (velocity > 0) {
if (this.currentThread != null)
this.currentThread.dead = true;
this.currentThread = new KickBallAction(this, room, client.getHabbo().getRoomUnit(), direction, velocity, false);
Emulator.getThreading().run(this.currentThread, 0);
}
}
}
@Override
public void onWalkOn(RoomUnit roomUnit, final Room room, Object[] objects) throws Exception {
super.onWalkOn(roomUnit, room, objects);
int velocity;
boolean isDrag = false;
RoomUserRotation direction;
if (this.getX() == roomUnit.getGoal().x && this.getY() == roomUnit.getGoal().y) //User clicked on the tile the ball is on, they want to kick it
{
velocity = this.getWalkOnVelocity(roomUnit, room);
direction = this.getWalkOnDirection(roomUnit, room);
this.onKick(room, roomUnit, velocity, direction);
} else //User is walking past the ball, they want to drag it with them
{
velocity = this.getDragVelocity(roomUnit, room);
direction = this.getDragDirection(roomUnit, room);
this.onDrag(room, roomUnit, velocity, direction);
isDrag = true;
}
if (velocity > 0) {
if (this.currentThread != null)
this.currentThread.dead = true;
this.currentThread = new KickBallAction(this, room, roomUnit, direction, velocity, isDrag);
Emulator.getThreading().run(this.currentThread, 0);
}
}
public abstract int getWalkOnVelocity(RoomUnit roomUnit, Room room);
public abstract RoomUserRotation getWalkOnDirection(RoomUnit roomUnit, Room room);
public abstract int getWalkOffVelocity(RoomUnit roomUnit, Room room);
public abstract RoomUserRotation getWalkOffDirection(RoomUnit roomUnit, Room room);
public abstract int getDragVelocity(RoomUnit roomUnit, Room room);
public abstract RoomUserRotation getDragDirection(RoomUnit roomUnit, Room room);
public abstract int getTackleVelocity(RoomUnit roomUnit, Room room);
public abstract RoomUserRotation getTackleDirection(RoomUnit roomUnit, Room room);
public abstract int getNextRollDelay(int currentStep, int totalSteps); //The length in milliseconds when the ball should next roll
public abstract RoomUserRotation getBounceDirection(Room room, RoomUserRotation currentDirection); //Returns the new direction to move the ball when the ball cannot move
public abstract boolean validMove(Room room, RoomTile from, RoomTile to); //Checks if the next move is valid
public abstract void onDrag(Room room, RoomUnit roomUnit, int velocity, RoomUserRotation direction);
public abstract void onKick(Room room, RoomUnit roomUnit, int velocity, RoomUserRotation direction);
public abstract void onTackle(Room room, RoomUnit roomUnit, int velocity, RoomUserRotation direction);
public abstract void onMove(Room room, RoomTile from, RoomTile to, RoomUserRotation direction, RoomUnit kicker, int nextRoll, int currentStep, int totalSteps);
public abstract void onBounce(Room room, RoomUserRotation oldDirection, RoomUserRotation newDirection, RoomUnit kicker);
public abstract void onStop(Room room, RoomUnit kicker, int currentStep, int totalSteps);
public abstract boolean canStillMove(Room room, RoomTile from, RoomTile to, RoomUserRotation direction, RoomUnit kicker, int nextRoll, int currentStep, int totalSteps);
}