diff --git a/src/main/java/net/gtaun/shoebill/SampEventDispatcher.java b/src/main/java/net/gtaun/shoebill/SampEventDispatcher.java index ab66775..743e502 100644 --- a/src/main/java/net/gtaun/shoebill/SampEventDispatcher.java +++ b/src/main/java/net/gtaun/shoebill/SampEventDispatcher.java @@ -20,6 +20,8 @@ import net.gtaun.shoebill.amx.AmxHook; import net.gtaun.shoebill.constant.*; import net.gtaun.shoebill.data.*; +import net.gtaun.shoebill.event.actor.ActorStreamInEvent; +import net.gtaun.shoebill.event.actor.ActorStreamOutEvent; import net.gtaun.shoebill.event.checkpoint.CheckpointEnterEvent; import net.gtaun.shoebill.event.checkpoint.CheckpointLeaveEvent; import net.gtaun.shoebill.event.checkpoint.RaceCheckpointEnterEvent; @@ -2038,6 +2040,63 @@ public int[] onHookCall(String name, Object... objects) { return new int[]{event.getReturnValue(), event.isDisallow()}; } + @Override + public int onActorStreamIn(int actor, int playerid) { + try { + Actor actorObject = Actor.get(actor); + Player player = Player.get(playerid); + ActorStreamInEvent event = new ActorStreamInEvent(actorObject, player); + rootEventManager.dispatchEvent(event, actorObject, player); + } catch (Throwable e) { + e.printStackTrace(); + return 0; + } + return 1; + } + + @Override + public int onActorStreamOut(int actor, int playerid) { + try { + Actor actorObject = Actor.get(actor); + Player player = Player.get(playerid); + ActorStreamOutEvent event = new ActorStreamOutEvent(actorObject, player); + rootEventManager.dispatchEvent(event, actorObject, player); + } catch (Throwable e) { + e.printStackTrace(); + return 0; + } + return 1; + } + + @Override + public int onPlayerGiveDamageActor(int playerid, int actor, int amount, int weapon, int bodypart) { + try { + Player player = Player.get(playerid); + Actor actorObject = Actor.get(actor); + WeaponModel model = WeaponModel.get(weapon); + PlayerDamageActorEvent event = new PlayerDamageActorEvent(player, actorObject, amount, model, bodypart); + rootEventManager.dispatchEvent(event, player, actorObject, model); + } catch (Throwable e) { + e.printStackTrace(); + return 0; + } + return 1; + } + + @Override + public int onVehicleSirenStateChange(int playerid, int vehicleid, int newstate) { + try { + Player player = Player.get(playerid); + Vehicle vehicle = Vehicle.get(vehicleid); + VehicleSirenStateChangeEvent event = new VehicleSirenStateChangeEvent(vehicle, player, newstate > 0); + rootEventManager.dispatchEvent(event, vehicle, player, newstate > 0); + } catch (Throwable e) { + e.printStackTrace(); + return 0; + } + return 1; + } + public void executeWithoutEvent(Runnable func) { this.active = false; func.run(); diff --git a/src/main/java/net/gtaun/shoebill/SampObjectManagerImpl.java b/src/main/java/net/gtaun/shoebill/SampObjectManagerImpl.java index 7499f92..17e1286 100644 --- a/src/main/java/net/gtaun/shoebill/SampObjectManagerImpl.java +++ b/src/main/java/net/gtaun/shoebill/SampObjectManagerImpl.java @@ -376,4 +376,15 @@ public Timer createTimer(int interval, int count, TimerCallback callback) { throw new CreationFailedException(e); } } + + @Override + public Actor createActor(int modelid, Vector3D position, float angle) throws CreationFailedException { + try { + ActorImpl actor = new ActorImpl(modelid, position, angle); + super.setActor(actor.getId(), actor); + return actor; + } catch (Throwable e) { + throw new CreationFailedException(e); + } + } } diff --git a/src/main/java/net/gtaun/shoebill/SampObjectStoreImpl.java b/src/main/java/net/gtaun/shoebill/SampObjectStoreImpl.java index 94f084d..f8bda33 100644 --- a/src/main/java/net/gtaun/shoebill/SampObjectStoreImpl.java +++ b/src/main/java/net/gtaun/shoebill/SampObjectStoreImpl.java @@ -51,6 +51,7 @@ public class SampObjectStoreImpl implements SampObjectStore { public static final int MAX_PLAYER_LABELS = 1024; public static final int MAX_PICKUPS = 4096; public static final int MAX_CLASSES = 300; + public static final int MAX_ACTORS = 1000; protected final EventManager eventManagerNode; private Server server; private World world; @@ -65,6 +66,7 @@ public class SampObjectStoreImpl implements SampObjectStore { private PlayerTextdraw[][] playerTextdrawsArray = new PlayerTextdraw[MAX_PLAYERS][]; private Zone[] zones = new Zone[MAX_ZONES]; private Menu[] menus = new Menu[MAX_MENUS]; + private Actor[] actors = new Actor[MAX_ACTORS]; private SpawnInfo[] playerClasses = new SpawnInfo[MAX_CLASSES]; private Collection> timers = new ConcurrentLinkedQueue<>(); private Map> dialogs = new ConcurrentHashMap<>(); @@ -400,6 +402,32 @@ public Collection getPlayerClasses() { return items; } + @Override + public Collection getActors() { + return new ArrayList<>(Arrays.asList(actors)); + } + + @Override + public Actor getActor(int id) { + if (id < 0 || id > MAX_ACTORS) return null; + return actors[id]; + } + + @Override + public int getVehiclePoolSize() { + return SampNativeFunction.getVehiclePoolSize(); + } + + @Override + public int getPlayerPoolSize() { + return SampNativeFunction.getPlayerPoolSize(); + } + + @Override + public int getActorPoolSize() { + return SampNativeFunction.getActorPoolSize(); + } + public Collection getTimers() { Collection items = new ArrayList<>(); Collection> unusedItems = new ArrayList<>(); @@ -489,6 +517,10 @@ public void setMenu(int id, Menu menu) { public void setPlayerClass(int id, SpawnInfo playerClass) { playerClasses[id] = playerClass; } + public void setActor(int id, Actor actor) { + actors[id] = actor; + } + public void putTimer(TimerImpl timer) { clearUnusedReferences(timers); timers.add(new WeakReference<>(timer)); diff --git a/src/main/java/net/gtaun/shoebill/object/impl/ActorImpl.java b/src/main/java/net/gtaun/shoebill/object/impl/ActorImpl.java new file mode 100644 index 0000000..45f70ca --- /dev/null +++ b/src/main/java/net/gtaun/shoebill/object/impl/ActorImpl.java @@ -0,0 +1,92 @@ +package net.gtaun.shoebill.object.impl; + +import net.gtaun.shoebill.SampNativeFunction; +import net.gtaun.shoebill.data.AngledLocation; +import net.gtaun.shoebill.data.Vector3D; +import net.gtaun.shoebill.object.Actor; +import net.gtaun.shoebill.object.Player; + +/** + * Created by marvin on 01.05.15 in project shoebill-runtime. + * Copyright (c) 2015 Marvin Haschker. All rights reserved. + */ +public class ActorImpl implements Actor { + + private int id, modelid; + + + public ActorImpl(int modelid, Vector3D pos, float angle) { + this(modelid, pos, angle, true, -1); + } + + public ActorImpl(int modelid, Vector3D pos, float angle, boolean doExec, int id) { + this.modelid = modelid; + if (doExec) this.id = SampNativeFunction.createActor(modelid, pos.x, pos.y, pos.z, angle); + else this.id = id; + } + + @Override + public int getId() { + return this.id; + } + + @Override + public int getModel() { + return modelid; + } + + @Override + public AngledLocation getLocation() { + + AngledLocation pos = new AngledLocation(); + SampNativeFunction.getActorPos(id, pos); + + pos.angle = SampNativeFunction.getActorFacingAngle(id); + pos.worldId = SampNativeFunction.getActorVirtualWorld(id); + + return pos; + } + + @Override + public float getHealth() { + return SampNativeFunction.getActorHealth(id); + } + + @Override + public void setInvulnerable(boolean invulnerable) { + SampNativeFunction.setActorInvulnerable(id, invulnerable); + } + + @Override + public boolean isInvulnerable() { + return SampNativeFunction.isActorInvulnerable(id) > 0; + } + + @Override + public void applyAnimation(String animLib, String animName, float animSpeed, boolean loop, boolean lockX, boolean lockY, boolean freeze, int time) { + SampNativeFunction.applyActorAnimation(id, animLib, animName, animSpeed, loop ? 1 : 0, lockX ? 1 : 0, lockY ? 1 : 0, freeze ? 1 : 0, time); + } + + @Override + public void clearAnimation() { + SampNativeFunction.clearActorAnimations(id); + } + + @Override + public boolean isActorStreamedIn(Player player) { + return SampNativeFunction.isActorStreamedIn(id, player.getId()) > 0; + } + + @Override + public void destroy() { + if (isDestroyed()) return; + + SampNativeFunction.destroyActor(id); + this.id = -1; + } + + @Override + public boolean isDestroyed() { + return id < 0; + } +} diff --git a/src/main/java/net/gtaun/shoebill/object/impl/PlayerImpl.java b/src/main/java/net/gtaun/shoebill/object/impl/PlayerImpl.java index f215c9e..7d79c0f 100644 --- a/src/main/java/net/gtaun/shoebill/object/impl/PlayerImpl.java +++ b/src/main/java/net/gtaun/shoebill/object/impl/PlayerImpl.java @@ -1543,4 +1543,49 @@ public List getVarNames() { public PlayerVarType getVarType(String name) { return PlayerVarType.get(SampNativeFunction.getPVarType(id, name)); } + + @Override + public void disableRemoteVehicleCollisions(boolean b) { + SampNativeFunction.disableRemoteVehicleCollisions(id, b ? 1 : 0); + } + + @Override + public void enablePlayerCameraTarget(boolean b) { + SampNativeFunction.enablePlayerCameraTarget(id, b ? 1 : 0); + } + + @Override + public Actor getCameraTargetActor() { + int actorId = SampNativeFunction.getPlayerCameraTargetActor(id); + if (actorId != Actor.INVALID_ACTOR) return Actor.get(actorId); + return null; + } + + @Override + public SampObject getCameraTargetObject() { + int objectId = SampNativeFunction.getPlayerCameraTargetObject(id); + if (objectId != SampObject.INVALID_ID) return SampObject.get(objectId); + return null; + } + + @Override + public Player getCameraTargetPlayer() { + int playerId = SampNativeFunction.getPlayerCameraTargetPlayer(id); + if (playerId != Player.INVALID_ID) return Player.get(playerId); + return null; + } + + @Override + public Vehicle getCameraTargetVehicle() { + int vehicleId = SampNativeFunction.getPlayerCameraTargetVehicle(id); + if (vehicleId != Vehicle.INVALID_ID) return Vehicle.get(vehicleId); + return null; + } + + @Override + public Actor getTargetActor() { + int actorId = SampNativeFunction.getPlayerTargetActor(id); + if (actorId != Actor.INVALID_ACTOR) return Actor.get(actorId); + return null; + } } diff --git a/src/main/java/net/gtaun/shoebill/object/impl/PlayerObjectImpl.java b/src/main/java/net/gtaun/shoebill/object/impl/PlayerObjectImpl.java index c41b6fc..b6d04ff 100644 --- a/src/main/java/net/gtaun/shoebill/object/impl/PlayerObjectImpl.java +++ b/src/main/java/net/gtaun/shoebill/object/impl/PlayerObjectImpl.java @@ -315,4 +315,14 @@ public void setMaterialText(String text) { SampNativeFunction.setPlayerObjectMaterialText(player.getId(), id, text, 0, ObjectMaterialSize.SIZE_256x128.getValue(), "Arial", 24, 1, 0xFFFFFFFF, 0, 0); } + + @Override + public void setNoCameraCol() { + SampNativeFunction.setObjectNoCameraCol(id); + } + + @Override + public void setPlayerObjectNoCameraCol() { + SampNativeFunction.setPlayerObjectNoCameraCol(player.getId(), id); + } } diff --git a/src/main/java/net/gtaun/shoebill/object/impl/SampObjectImpl.java b/src/main/java/net/gtaun/shoebill/object/impl/SampObjectImpl.java index 3a0e684..f7385a4 100644 --- a/src/main/java/net/gtaun/shoebill/object/impl/SampObjectImpl.java +++ b/src/main/java/net/gtaun/shoebill/object/impl/SampObjectImpl.java @@ -352,4 +352,9 @@ public void setMaterialText(String text, int materialIndex, ObjectMaterialSize m public void setMaterialText(String text) { setMaterialText(text, 0, ObjectMaterialSize.SIZE_256x128, "Arial", 24, true, Color.WHITE, Color.TRANSPARENT, ObjectMaterialTextAlign.LEFT); } + + @Override + public void setNoCameraCol() { + SampNativeFunction.setObjectNoCameraCol(id); + } } diff --git a/src/main/java/net/gtaun/shoebill/object/impl/VehicleImpl.java b/src/main/java/net/gtaun/shoebill/object/impl/VehicleImpl.java index 064a1ea..4e6a611 100644 --- a/src/main/java/net/gtaun/shoebill/object/impl/VehicleImpl.java +++ b/src/main/java/net/gtaun/shoebill/object/impl/VehicleImpl.java @@ -441,6 +441,35 @@ public void repair() { SampNativeFunction.repairVehicle(id); } + @Override + public VehicleState getDoors() { + VehicleState params = new VehicleState(); + SampNativeFunction.getVehicleParamsCarDoors(id, params); + return params; + } + + @Override + public VehicleState getWindows() { + VehicleState params = new VehicleState(); + SampNativeFunction.getVehicleParamsCarWindows(id, params); + return params; + } + + @Override + public int getSirenState() { + return SampNativeFunction.getVehicleParamsSirenState(id); + } + + @Override + public void setDoors(VehicleState vehicleState) { + SampNativeFunction.setVehicleParamsCarDoors(id, vehicleState.driver, vehicleState.passenger, vehicleState.backLeft, vehicleState.backRight); + } + + @Override + public void setWindows(VehicleState vehicleState) { + SampNativeFunction.setVehicleParamsCarWindows(id, vehicleState.driver, vehicleState.passenger, vehicleState.backLeft, vehicleState.backRight); + } + @Override public void setAngularVelocity(Velocity velocity) { if (isDestroyed()) return; diff --git a/src/main/java/net/gtaun/shoebill/object/impl/WorldImpl.java b/src/main/java/net/gtaun/shoebill/object/impl/WorldImpl.java index a3dc3f3..04320e7 100644 --- a/src/main/java/net/gtaun/shoebill/object/impl/WorldImpl.java +++ b/src/main/java/net/gtaun/shoebill/object/impl/WorldImpl.java @@ -220,4 +220,9 @@ public void enableStuntBonusForAll(boolean enabled) { public void manualEngineAndLights() { SampNativeFunction.manualVehicleEngineAndLights(); } + + @Override + public void setObjectsDefaultCameraCol(boolean disable) { + SampNativeFunction.setObjectsDefaultCameraCol(disable ? 1 : 0); + } } diff --git a/src/main/java/net/gtaun/shoebill/samp/SampCallbackHandler.java b/src/main/java/net/gtaun/shoebill/samp/SampCallbackHandler.java index c823a57..135d66f 100644 --- a/src/main/java/net/gtaun/shoebill/samp/SampCallbackHandler.java +++ b/src/main/java/net/gtaun/shoebill/samp/SampCallbackHandler.java @@ -519,4 +519,20 @@ default int onAmxChangeVehicleColor(int vehicleid, int color1, int color2) { default int[] onHookCall(String name, Object... objects) { return new int[]{0, 0}; } + + default int onActorStreamIn(int actor, int playerid) { + return 1; + } + + default int onActorStreamOut(int actor, int playerid) { + return 1; + } + + default int onPlayerGiveDamageActor(int playerid, int actor, int amount, int weapon, int bodypart) { + return 1; + } + + default int onVehicleSirenStateChange(int playerid, int vehicleid, int newstate) { + return 1; + } } diff --git a/src/main/java/net/gtaun/shoebill/samp/SampCallbackManagerImpl.java b/src/main/java/net/gtaun/shoebill/samp/SampCallbackManagerImpl.java index 93efe09..7bacf0a 100644 --- a/src/main/java/net/gtaun/shoebill/samp/SampCallbackManagerImpl.java +++ b/src/main/java/net/gtaun/shoebill/samp/SampCallbackManagerImpl.java @@ -796,6 +796,30 @@ public int[] onHookCall(String name, Object... objects) { callbackHandlers.stream().filter(SampCallbackHandler::isActive).forEach(handler -> TryUtils.tryTo(() -> event[0] = handler.onHookCall(name, objects))); return (int[]) event[0]; } + + @Override + public int onActorStreamIn(int actor, int playerid) { + callbackHandlers.stream().filter(SampCallbackHandler::isActive).forEach(handler -> TryUtils.tryTo(() -> handler.onActorStreamIn(actor, playerid))); + return 1; + } + + @Override + public int onActorStreamOut(int actor, int playerid) { + callbackHandlers.stream().filter(SampCallbackHandler::isActive).forEach(handler -> TryUtils.tryTo(() -> handler.onActorStreamOut(actor, playerid))); + return 1; + } + + @Override + public int onPlayerGiveDamageActor(int playerid, int actor, int amount, int weapon, int bodypart) { + callbackHandlers.stream().filter(SampCallbackHandler::isActive).forEach(handler -> TryUtils.tryTo(() -> handler.onPlayerGiveDamageActor(playerid, actor, amount, weapon, bodypart))); + return 1; + } + + @Override + public int onVehicleSirenStateChange(int playerid, int vehicleid, int newstate) { + callbackHandlers.stream().filter(SampCallbackHandler::isActive).forEach(handler -> TryUtils.tryTo(() -> handler.onVehicleSirenStateChange(playerid, vehicleid, newstate))); + return 1; + } }; public SampCallbackManagerImpl() { diff --git a/src/main/resources/version.yml b/src/main/resources/version.yml index 95dcfac..ce1f963 100644 --- a/src/main/resources/version.yml +++ b/src/main/resources/version.yml @@ -1,5 +1,5 @@ name: Shoebill Runtime version: ${version} -support: SA-MP 0.3z R2-4 +support: SA-MP 0.3.7 buildNumber: ${build.number} buildDate: ${build.timestamp}