hanf wachstum
This commit is contained in:
@@ -12,7 +12,29 @@ const hanfPlantObjects = {
|
||||
stage4: mp.game.joaat('prop_weed_01')
|
||||
};
|
||||
|
||||
const minimumPlantDistance = 5;
|
||||
const hanfTimeToObject = [
|
||||
{
|
||||
minutes: 15,
|
||||
object: hanfPlantObjects.stage1,
|
||||
},
|
||||
{
|
||||
minutes: 60 * 1,
|
||||
object: hanfPlantObjects.stage2
|
||||
},
|
||||
{
|
||||
minutes: 60 * 3,
|
||||
object: hanfPlantObjects.stage3
|
||||
},
|
||||
{
|
||||
minutes: 60 * 4,
|
||||
object: hanfPlantObjects.stage4
|
||||
}
|
||||
]
|
||||
|
||||
const minimumPlantDistance = 2;
|
||||
|
||||
const maximumPlantDuration = 6 * 60 * 60 * 1000; // 6 Stunden / 360 Minuten / 21600 Sekunden / 21600000 Millisekunden
|
||||
const timeToHarvestPlant = 4 * 60 * 60 * 1000; // 4 Stunden
|
||||
|
||||
export default function hanfSystem(globalData: IGlobalData) {
|
||||
|
||||
@@ -128,13 +150,13 @@ export default function hanfSystem(globalData: IGlobalData) {
|
||||
function isAbleToPlant() {
|
||||
var player = mp.players.local;
|
||||
|
||||
if (isNearPlant()) {
|
||||
if (isNearPlant(minimumPlantDistance)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!isSurfaceAllowed()) {
|
||||
return false;
|
||||
}
|
||||
//if (!isSurfaceAllowed()) {
|
||||
// return false;
|
||||
//}
|
||||
|
||||
if (currentPlantingPreviewObject) {
|
||||
var objectPos = getPlantPreviewPosition();
|
||||
@@ -144,7 +166,7 @@ export default function hanfSystem(globalData: IGlobalData) {
|
||||
}
|
||||
}
|
||||
|
||||
if (player.isSwimming() || player.isSwimmingUnderWater() || !player.isOnFoot()) {
|
||||
if (player.isSwimming() || player.isSwimmingUnderWater() || !player.isOnFoot() || player.isSprinting() || player.isShooting()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -168,7 +190,19 @@ export default function hanfSystem(globalData: IGlobalData) {
|
||||
}
|
||||
|
||||
KeyBinder.bind('e', _ => {
|
||||
if (!currentlyPlanting || globalData.InChat) {
|
||||
if (globalData.InChat) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!currentlyPlanting) {
|
||||
var nearPlant = isNearPlant(0.5);
|
||||
|
||||
if (!nearPlant) {
|
||||
return;
|
||||
}
|
||||
|
||||
mp.events.callRemote("CLIENT:Hanf_HarvestHanf", nearPlant.Id);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -183,52 +217,128 @@ export default function hanfSystem(globalData: IGlobalData) {
|
||||
|
||||
if (currentPlantingPreviewObject) {
|
||||
currentPlantingPreviewObject.destroy();
|
||||
currentPlantingPreviewObject = null;
|
||||
}
|
||||
|
||||
if (currentPlantingMarkerPreview) {
|
||||
currentPlantingMarkerPreview.destroy();
|
||||
currentPlantingMarkerPreview = null;
|
||||
}
|
||||
|
||||
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);
|
||||
mp.events.callRemote("CLIENT:Hanf_PlantHanf", position.x, position.y, 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;
|
||||
function getPlantText(plant: CannabisData) {
|
||||
var time = Date.now() - Date.parse(plant.Time);
|
||||
if (time > maximumPlantDuration) {
|
||||
return ("~g~Hanf~n~~r~Verrottet");
|
||||
}
|
||||
return (`~g~Hanf~n~Fortschritt: ${getPlantPercentage(plant).toFixed(2)}%`);
|
||||
}
|
||||
|
||||
let currentHanfData: Array<CannabisData> = null;
|
||||
let hanfDataIdToObjectMap: Map<number, ObjectMp> = null;
|
||||
function getPlantPercentage(plant: CannabisData) {
|
||||
var time = Date.now() - Date.parse(plant.Time);
|
||||
return Math.min((time / timeToHarvestPlant) * 100, 100);
|
||||
}
|
||||
|
||||
mp.events.add("SERVER:Hanf_UpdateHanfData", dataJson => {
|
||||
var data: Array<CannabisData> = <Array<CannabisData>>JSON.parse(dataJson)
|
||||
if (currentHanfData == null) {
|
||||
currentHanfData = data;
|
||||
function isNearPlant(distance: number): CannabisData {
|
||||
var pos = getPlantPreviewPosition();
|
||||
var nearPlants = currentHanfData.filter(h =>
|
||||
mp.game.gameplay.getDistanceBetweenCoords(pos.x, pos.y, pos.z, h.X, h.Y, h.Z, true) < distance);
|
||||
|
||||
if (!nearPlants || nearPlants.length == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
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);
|
||||
nearPlants = nearPlants.sort((a, b) =>
|
||||
Number(mp.game.gameplay.getDistanceBetweenCoords(pos.x, pos.y, pos.z, a.X, a.Y, a.Z, true) <
|
||||
mp.game.gameplay.getDistanceBetweenCoords(pos.x, pos.y, pos.z, b.X, b.Y, b.Z, true)));
|
||||
|
||||
return nearPlants[0];
|
||||
}
|
||||
|
||||
let currentHanfData: Array<CannabisData> = [];
|
||||
let hanfDataIdToObjectMap: Map<number, ObjectMp> = new Map<number, ObjectMp>();
|
||||
let hanfDataIdToTextLabelMap: Map<number, TextLabelMp> = new Map<number, TextLabelMp>();
|
||||
|
||||
mp.events.add("SERVER:Hanf_UpdateHanfData", dataJson => {
|
||||
mp.console.logInfo(dataJson);
|
||||
var data: Array<CannabisData> = <Array<CannabisData>>JSON.parse(dataJson)
|
||||
|
||||
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}`);
|
||||
|
||||
newPlants.forEach(plant => {
|
||||
var model = getPlantModel(plant);
|
||||
mp.gui.chat.push("new id: " + plant.Id + ", model = " + model);
|
||||
var object = mp.objects.new(getPlantModel(plant), new mp.Vector3(plant.X, plant.Y, plant.Z));
|
||||
hanfDataIdToObjectMap.set(plant.Id, object);
|
||||
|
||||
var textLabel = mp.labels.new(getPlantText(plant), new mp.Vector3(plant.X, plant.Y, plant.Z + 1), {
|
||||
los: true,
|
||||
drawDistance: 2
|
||||
});
|
||||
hanfDataIdToTextLabelMap.set(plant.Id, textLabel);
|
||||
});
|
||||
|
||||
removedPlants.forEach(plant => {
|
||||
//mp.gui.chat.push("removed id: " + plant.Id);
|
||||
var object = hanfDataIdToObjectMap.get(plant.Id);
|
||||
hanfDataIdToObjectMap.delete(plant.Id);
|
||||
object.destroy();
|
||||
var textLabel = hanfDataIdToTextLabelMap.get(plant.Id);
|
||||
textLabel.destroy();
|
||||
hanfDataIdToTextLabelMap.delete(plant.Id);
|
||||
});
|
||||
|
||||
existingPlants.forEach(plant => {
|
||||
//mp.gui.chat.push("existing plant: " + plant.Id + ", plant time = " + new Date(plant.Time).toLocaleTimeString() + ", current time = " + new Date().toLocaleTimeString());
|
||||
var object = hanfDataIdToObjectMap.get(plant.Id);
|
||||
var model = getPlantModel(plant);
|
||||
if (model != object.model) {
|
||||
//mp.gui.chat.push("existing plant: " + plant.Id + ", changing model to = " + model);
|
||||
object.destroy();
|
||||
var object = mp.objects.new(model, new mp.Vector3(plant.X, plant.Y, plant.Z));
|
||||
hanfDataIdToObjectMap.delete(plant.Id);
|
||||
hanfDataIdToObjectMap.set(plant.Id, object);
|
||||
}
|
||||
|
||||
var textLabel = hanfDataIdToTextLabelMap.get(plant.Id);
|
||||
textLabel.text = getPlantText(plant);
|
||||
});
|
||||
|
||||
currentHanfData = data;
|
||||
});
|
||||
|
||||
function getPlantModel(plant: CannabisData): number {
|
||||
var diff = Date.now() - Date.parse(plant.Time);
|
||||
var model = -1;
|
||||
|
||||
var dbgTxt;
|
||||
|
||||
if (diff <= 30 * 60 * 1000) { // 0 - 30 Minuten
|
||||
model = hanfPlantObjects.stage1;
|
||||
dbgTxt = "30 Minuten";
|
||||
} else if (diff <= 4 * 60 * 60 * 1000) { // 30 - 240 Minuten / 4 Stunden
|
||||
model = hanfPlantObjects.stage3;
|
||||
dbgTxt = "3 Stunden";
|
||||
} else { // Ausgewachsen / Ab 4 Stunden
|
||||
model = hanfPlantObjects.stage4;
|
||||
dbgTxt = "4 Stunden";
|
||||
}
|
||||
|
||||
//mp.gui.chat.push("plant id = " + plant.Id + ", age = " + dbgTxt);
|
||||
|
||||
return model;
|
||||
}
|
||||
}
|
||||
@@ -168,5 +168,5 @@ export {
|
||||
EntityType,
|
||||
AccountData,
|
||||
VehicleData,
|
||||
DoorState
|
||||
DoorState,
|
||||
}
|
||||
10
ReallifeGamemode.Client/global.d.ts
vendored
10
ReallifeGamemode.Client/global.d.ts
vendored
@@ -98,11 +98,11 @@ declare type RentcarProperty = {
|
||||
}
|
||||
|
||||
declare type CannabisData = {
|
||||
id: number;
|
||||
x: number;
|
||||
y: number;
|
||||
z: number;
|
||||
time: Date;
|
||||
Id: number;
|
||||
X: number;
|
||||
Y: number;
|
||||
Z: number;
|
||||
Time: string;
|
||||
}
|
||||
|
||||
declare type PlayerCharacterData = {
|
||||
|
||||
Reference in New Issue
Block a user