234 lines
8.0 KiB
TypeScript
234 lines
8.0 KiB
TypeScript
import { Menu, Point, UIMenuSliderItem, UIMenuItem, Color, UIMenuListItem, ItemsCollection } from "../libs/NativeUI";
|
|
import { createMenuItem } from "../util";
|
|
import moneyformat from "../moneyformat";
|
|
import { getAnimFromId } from "../util/animationSync";
|
|
import { getCreatedPedByName } from "../Ped/PedCreator";
|
|
import KeyBinder from 'ragemp-better-bindings';
|
|
|
|
const hanfPlantObjects = {
|
|
stage1: mp.game.joaat('bkr_prop_weed_bud_pruned_01a'),
|
|
stage2: mp.game.joaat('bkr_prop_weed_bud_01b'),
|
|
stage3: mp.game.joaat('prop_weed_02'),
|
|
stage4: mp.game.joaat('prop_weed_01')
|
|
};
|
|
|
|
const minimumPlantDistance = 5;
|
|
|
|
export default function hanfSystem(globalData: IGlobalData) {
|
|
|
|
let currentPlantingPreviewObject: ObjectMp = null;
|
|
let currentPlantingMarkerPreview: MarkerMp = null;
|
|
let currentlyPlanting: boolean = false;
|
|
let lastPlantingState = true;
|
|
|
|
mp.events.add("SERVER:Hanf_BuySeed", price => {
|
|
if (globalData.InMenu || globalData.InChat) {
|
|
return;
|
|
}
|
|
|
|
globalData.InMenu = true;
|
|
|
|
var menu = new Menu("Samen kaufen", "Kaufe dir Hanfsamen", new Point(50, 50));
|
|
|
|
var seedsToBuy = 0;
|
|
|
|
var countItems = [...Array(50).keys()].map(x => x + 1);
|
|
|
|
var soloPriceItem = createMenuItem("Einzelpreis", "Preis pro Samen", item => {
|
|
item.SetRightLabel("$" + moneyformat(price));
|
|
});
|
|
menu.AddItem(soloPriceItem);
|
|
|
|
var countItem = new UIMenuListItem("Anzahl", "Wähle die Anzahl der Samen aus", new ItemsCollection(countItems), 0);
|
|
menu.AddItem(countItem);
|
|
|
|
var buyItem = new UIMenuItem("Kaufen", "Kaufe die Samen");
|
|
buyItem.BackColor = new Color(0, 100, 0);
|
|
buyItem.HighlightedBackColor = new Color(0, 150, 0);
|
|
menu.AddItem(buyItem);
|
|
|
|
var completePriceItem = new UIMenuItem("Gesamtpreis", "Preis für alle Samen");
|
|
menu.AddItem(completePriceItem);
|
|
|
|
menu.ListChange.on((item, index) => {
|
|
if (item === countItem) {
|
|
seedsToBuy = Number(countItem.SelectedValue);
|
|
completePriceItem.SetRightLabel("$" + moneyformat(seedsToBuy * price));
|
|
}
|
|
});
|
|
|
|
menu.ItemSelect.on((item, index) => {
|
|
if (item === buyItem) {
|
|
mp.events.callRemote("CLIENT:Hanf_BuySeeds", seedsToBuy);
|
|
menu.Close();
|
|
}
|
|
});
|
|
|
|
menu.MenuClose.on(() => {
|
|
globalData.InMenu = false;
|
|
});
|
|
|
|
menu.Open();
|
|
});
|
|
|
|
mp.events.add("SERVER:Hanf_PlayManufacturerAnim", animId => {
|
|
var anim = getAnimFromId(animId);
|
|
var npc = getCreatedPedByName("hanf_verarbeiter_typ");
|
|
npc.taskPlayAnim(anim.dict, anim.name, 1, 0, 1000 * 10, 1, 0, !1, !1, !1);
|
|
setTimeout(() => {
|
|
npc.stopAnim(anim.name, anim.dict, 3);
|
|
npc.stopAnimTask(anim.dict, anim.name, 3);
|
|
}, 1000 * 10);
|
|
});
|
|
|
|
mp.events.add("SERVER:Hanf_StartPlanting", _ => {
|
|
let player = mp.players.local;
|
|
currentPlantingPreviewObject = mp.objects.new(hanfPlantObjects.stage1, player.position, {
|
|
alpha: 255
|
|
});
|
|
currentPlantingPreviewObject.notifyStreaming = true;
|
|
|
|
currentlyPlanting = true;
|
|
});
|
|
|
|
mp.events.add(RageEnums.EventKey.RENDER, _ => {
|
|
if (!currentlyPlanting) {
|
|
return;
|
|
}
|
|
|
|
var player = mp.players.local;
|
|
|
|
var newPlantState = isAbleToPlant();
|
|
|
|
var markerColor: [number, number, number, number] = [0, 255, 0, 255];
|
|
if (!newPlantState) {
|
|
markerColor = [255, 0, 0, 255];
|
|
}
|
|
|
|
if (currentPlantingMarkerPreview) {
|
|
currentPlantingMarkerPreview.destroy();
|
|
}
|
|
|
|
var playerPos = player.position;
|
|
var objectPos = new mp.Vector3(playerPos.x, playerPos.y, playerPos.z - 1.0);
|
|
|
|
currentPlantingMarkerPreview = mp.markers.new(25, objectPos, 0.7, {
|
|
color: markerColor,
|
|
visible: true,
|
|
rotation: new mp.Vector3(1, 0, 0)
|
|
});
|
|
});
|
|
|
|
mp.events.add(RageEnums.EventKey.ENTITY_STREAM_IN, entity => {
|
|
if (entity === currentPlantingPreviewObject) {
|
|
currentPlantingPreviewObject.attachTo(Number(mp.players.local.handle), 0, 0, 0.2, -0.95, 0, 0, 0, true, false, false, false, 0, true);
|
|
}
|
|
});
|
|
|
|
function isAbleToPlant() {
|
|
var player = mp.players.local;
|
|
|
|
if (isNearPlant()) {
|
|
return false;
|
|
}
|
|
|
|
if (!isSurfaceAllowed()) {
|
|
return false;
|
|
}
|
|
|
|
if (currentPlantingPreviewObject) {
|
|
var objectPos = getPlantPreviewPosition();
|
|
var realZ = mp.game.gameplay.getGroundZFor3dCoord(objectPos.x, objectPos.y, objectPos.z + 1, 0, false);
|
|
if (realZ > objectPos.z + 1) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (player.isSwimming() || player.isSwimmingUnderWater() || !player.isOnFoot()) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
const RAYCAST_POINT_TO_POINT_NATIVE = "0x377906D8A31E5586";
|
|
const GET_RAYCAST_RESULT_NATIVE = "0x65287525D951F6BE";
|
|
|
|
function isSurfaceAllowed() {
|
|
const player = mp.players.local;
|
|
var position = player.position;
|
|
var raycast = mp.game.invoke(RAYCAST_POINT_TO_POINT_NATIVE, position.x, position.y, position.z + 5, position.x, position.y, position.z - 5, -1, undefined, 0);
|
|
mp.gui.chat.push("raycast = " + raycast);
|
|
var hit: boolean, coord: Vector3Mp, surfaceNormal: Vector3Mp, materialHash: number, entityHit: EntityMp;
|
|
var raycastResult = mp.game.invoke(GET_RAYCAST_RESULT_NATIVE, raycast, hit, coord, surfaceNormal, materialHash, entityHit);
|
|
|
|
mp.gui.chat.push("result: " + raycastResult + ", hit = " + hit + ", test = " + materialHash);
|
|
|
|
return true;
|
|
}
|
|
|
|
KeyBinder.bind('e', _ => {
|
|
if (!currentlyPlanting || globalData.InChat) {
|
|
return;
|
|
}
|
|
|
|
if (!lastPlantingState) {
|
|
mp.game.graphics.notify("~r~Hier kann kein Hanf platziert werden");
|
|
return;
|
|
}
|
|
|
|
currentlyPlanting = false;
|
|
|
|
var player = mp.players.local;
|
|
|
|
if (currentPlantingPreviewObject) {
|
|
currentPlantingPreviewObject.destroy();
|
|
}
|
|
|
|
if (currentPlantingMarkerPreview) {
|
|
currentPlantingMarkerPreview.destroy();
|
|
}
|
|
|
|
var position = getPlantPreviewPosition();
|
|
var realZ = mp.game.gameplay.getGroundZFor3dCoord(position.x, position.y, position.z + 2, 0, false);
|
|
|
|
mp.events.callRemote("CLIENT:Hanf_PlantHanf", position.x, position.z, realZ);
|
|
});
|
|
|
|
function getPlantPreviewPosition(): Vector3Mp {
|
|
return mp.players.local.getOffsetFromInWorldCoords(0, 0.2, -1);
|
|
}
|
|
|
|
function isNearPlant(): boolean {
|
|
var position = getPlantPreviewPosition();
|
|
var nearPlant = false;
|
|
|
|
Object.keys(hanfPlantObjects).forEach(k => {
|
|
var hash = hanfPlantObjects[k];
|
|
var obj = mp.game.object.getClosestObjectOfType(position.x, position.y, position.z, minimumPlantDistance, hash, false, false, false);
|
|
if (obj && obj != currentPlantingPreviewObject.handle) {
|
|
nearPlant = true;
|
|
}
|
|
});
|
|
|
|
return nearPlant;
|
|
}
|
|
|
|
let currentHanfData: Array<CannabisData> = null;
|
|
let hanfDataIdToObjectMap: Map<number, ObjectMp> = null;
|
|
|
|
mp.events.add("SERVER:Hanf_UpdateHanfData", dataJson => {
|
|
var data: Array<CannabisData> = <Array<CannabisData>>JSON.parse(dataJson)
|
|
if (currentHanfData == null) {
|
|
currentHanfData = data;
|
|
}
|
|
|
|
var newPlants = data.filter(d => currentHanfData.filter(x => x.id === d.id).length == 0);
|
|
var removedPlants = currentHanfData.filter(d => data.filter(x => x.id === d.id).length == 0);
|
|
var existingPlants = data.filter(d => currentHanfData.filter(x => x.id === d.id).length == 1);
|
|
|
|
mp.gui.chat.push(`new: ${newPlants.length}, removed: ${removedPlants.length}, existing: ${existingPlants.length}`);
|
|
|
|
currentHanfData = data;
|
|
});
|
|
} |