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 = null; let hanfDataIdToObjectMap: Map = null; mp.events.add("SERVER:Hanf_UpdateHanfData", dataJson => { var data: Array = >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; }); }