using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers; using GTANetworkAPI; using Microsoft.Extensions.Logging; using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Extensions; using ReallifeGamemode.Server.Inventory.Interfaces; using ReallifeGamemode.Server.Inventory.Items; using ReallifeGamemode.Server.Services; using ReallifeGamemode.Server.Util; namespace ReallifeGamemode.Server.Managers { public class HanfManager : BaseScript { /// /// Punkte zum Samen kaufen /// private readonly static List _seedsBuyPoints = new List(); /// /// Aktueller Samen-Preis /// public static int SEED_PRICE = 50; /// /// Wie viele Joints man aus einem Cannabis bekommt /// public static int CANNABIS_TO_JOINT_RATIO = 3; /// /// Flag, ob der Verarbeiter aktuell benutzt wird /// private static bool _manufacturerCurrentlyUsed = false; /// /// Marihuana -> Joint /// private readonly static Vector3 _jointManufacturerPoint = new Vector3(-127.726105, 1921.5142, 197.31104); /// /// Animations-ID des Verarbeitens /// private const string _manufacturerAnim = "manufacturJoint"; private static Timer _manufacturerDoneTimer = new Timer(TimeSpan.FromSeconds(10).TotalMilliseconds); static HanfManager() { _manufacturerDoneTimer.Elapsed += ManufacturerDoneTimerCallback; } /// /// Ladefunktion zum /// public static void Load() { _seedsBuyPoints.Add(new Vector3(-30.21876, -585.3222, 17.917326)); _seedsBuyPoints.Add(new Vector3(-680.89386, -634.6783, 25.29923)); _seedsBuyPoints.Add(new Vector3(-1310.743, -608.9064, 29.382874)); _seedsBuyPoints.Add(new Vector3(-758.6156, -1595.2686, 6.302392)); _seedsBuyPoints.Add(new Vector3(-441.0504, 1595.4435, 358.4195)); ColShape colShape = null; foreach (Vector3 buyPoint in _seedsBuyPoints) { colShape = NAPI.ColShape.CreateSphereColShape(buyPoint, 20.0f); colShape.OnEntityEnterColShape += OnSeedBuyRangeColShapeEnter; } } private static void OnSeedBuyRangeColShapeEnter(ColShape colShape, Player player) { ChatService.SendMessage(player, $"Fremder sagt: Pssst.. Willst paar Samen erwerben?"); } internal static bool IsPlayerNearSeedBuyPoint(Player player) { return _seedsBuyPoints.Any(p => player.Position.DistanceTo(p) <= 2.5f); } internal static bool IsPlayerNearJointManufacturer(Player player) { return _jointManufacturerPoint.DistanceTo(player.Position) <= 2.5f; } [RemoteEvent("CLIENT:Hanf_BuySeeds")] public void HanfManagerBuySeeds(Player player, int amount) { if (!player.IsLoggedIn()) { return; } using var dbContext = new DatabaseContext(); var user = player.GetUser(dbContext); IItem seedItem = InventoryManager.GetItem(); var newAmount = seedItem.Gewicht * amount; if (!InventoryManager.CanPlayerHoldMoreWeight(player, newAmount)) { player.TriggerEvent("~r~So viele Samen passen nicht mehr in deine Hosentasche"); return; } var price = amount * SEED_PRICE; if (user.Handmoney < price) { player.SendNotification("~r~Du hast nicht genug Geld dafür"); return; } logger.LogInformation("Player {0} bought {1} cannabis seeds for {2} dollars (price per seed: {3})", player.Name, amount, price, SEED_PRICE); // <-- WICHTIG LOGS user.Handmoney -= price; dbContext.SaveChanges(); InventoryManager.AddItemToInventory(player, seedItem.Id, amount); player.SendNotification($"Du hast {amount} Hanfsamen gekauft"); } internal static void BuildJointsFromCannabis(Player player) { if(player.HasAnimation(_manufacturerAnim) || _manufacturerCurrentlyUsed) { return; } using var dbContext = new DatabaseContext(); var user = player.GetUser(dbContext); var userItems = InventoryManager.GetUserItems(player, dbContext); IItem cannabisItem = InventoryManager.GetItem(); IItem jointItem = InventoryManager.GetItem(); var addWeight = jointItem.Gewicht * CANNABIS_TO_JOINT_RATIO - cannabisItem.Gewicht; if (!InventoryManager.CanPlayerHoldMoreWeight(player, addWeight)) { player.SendNotification("~r~Für die Verarbeitung hast du nicht genug Platz im Rucksack"); return; } UserItem userCannabisItem = userItems.Where(i => i.ItemId == cannabisItem.Id).FirstOrDefault(); if (userCannabisItem == null) { player.SendNotification("~r~Du hast kein Cannabis dabei"); return; } _manufacturerCurrentlyUsed = true; _manufacturerDoneTimer.Start(); player.SyncAnimation(_manufacturerAnim); InventoryManager.RemoveUserItem(user, userCannabisItem, 1); InventoryManager.AddItemToInventory(player, jointItem.Id, CANNABIS_TO_JOINT_RATIO); player.SendNotification($"Du hast 1 Cannabis in {CANNABIS_TO_JOINT_RATIO} Joints verarbeitet"); NAPI.ClientEvent.TriggerClientEventInRange(player.Position, 100.0f, "SERVER:Hanf_PlayManufacturerAnim", _manufacturerAnim); } private static void ManufacturerDoneTimerCallback(object sender, EventArgs args) { _manufacturerDoneTimer.Stop(); _manufacturerCurrentlyUsed = false; } } }