Skip to content

Instantly share code, notes, and snippets.

@Seregamil
Created January 13, 2022 16:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Seregamil/015f1869b23852ad69cc6e02f0a07098 to your computer and use it in GitHub Desktop.
Save Seregamil/015f1869b23852ad69cc6e02f0a07098 to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
using System.Linq;
using GM.Client;
using GM.Client.Friends;
using GM.Global;
using GM.Property.Businesses.RefuelStations;
using GM.Property.Businesses.Shops.ClothShop;
using GM.Property.Businesses.Shops.ProductShop;
using GM.Property.Businesses.Showrooms;
using GM.Property.Houses;
using GM.Property.Vehicle;
using GM.World.Atm;
using GTANetworkAPI;
namespace GM.InteractionSystem
{
public class InteractHandler : Script
{
/// <summary>
///
/// </summary>
/// <param name="target">Принимает соглашение цель события, так что target</param>
[RemoteEvent("Interaction:Accept")]
public void InteractionAccept(Player target)
{
var interact = target.GetInteractModel();
target.StopInteract();
if(interact == null)
return;
var player = interact.Source;
if (player == null || !NAPI.Player.IsPlayerConnected(player))
{
target.ShowNotify(Notify.MessageType.Alert, "Инициатор события покинул сервер");
return;
}
player.StopInteract();
var playerProfile = player.GetProfile();
var targetProfile = target.GetProfile();
if (playerProfile == null || targetProfile == null)
{
target.ShowNotify(Notify.MessageType.Alert, "Какая-то ошибка, сброс данных x3");
return;
}
bool result;
switch (interact.InteractType)
{
case InteractType.MoneyTransfer:
break;
case InteractType.AddFriend:
result = FriendsHandler.AddFriend(playerProfile, targetProfile);
if (!result)
{
player.ShowNotify(Notify.MessageType.Alert, $"Не удалось подружиться с игроком {target.Name}!");
target.ShowNotify(Notify.MessageType.Alert, $"Не удалось подружиться с игроком {player.Name}!");
}
else
{
player.ShowNotify(Notify.MessageType.Success, $"Вы подружились с игроком {target.Name}!");
target.ShowNotify(Notify.MessageType.Success, $"Вы подружились с игроком {player.Name}!");
player.TriggerEvent("Player:Friends", playerProfile.FriendProfiles
.Select(x => x.TargetId)
.ToList());
target.TriggerEvent("Player:Friends", targetProfile.FriendProfiles
.Select(x => x.TargetId)
.ToList());
}
break;
case InteractType.MateInvite: {
var house = player.GetInHouse();
if (house == null)
{
player.ShowNotify(Notify.MessageType.Alert, "Вы должны быть внутри дома");
return;
}
if (!house.DoesOwner(playerProfile.Id))
{
player.ShowNotify(Notify.MessageType.Alert, "Вы не являетесь владельцем дома");
return;
}
if (house.MatesCapacity == house.GetMates().Count)
{
player.ShowNotify(Notify.MessageType.Alert, "Невозможно подселить нового игрока, все места заняты");
return;
}
if (house.DoesMate(targetProfile) || house.DoesOwner(targetProfile.Id))
{
player.ShowNotify(Notify.MessageType.Alert, "Игрок уже является сожителем данного дома");
return;
}
var targetHouse = target.GetInHouse();
if (targetHouse == null || targetHouse.Id != house.Id)
{
player.ShowNotify(Notify.MessageType.Alert, "Игрок должен быть внутри дома");
return;
}
result = house.TryMateInvite(targetProfile);
if (!result)
{
player.ShowNotify(Notify.MessageType.Success, "Ошибка добавления игрока в список сожителей");
target.ShowNotify(Notify.MessageType.Success, "Ошибка добавления игрока в список сожителей");
}
else
{
player.ShowNotify(Notify.MessageType.Success, $"Игрок {target.Name} теперь является сожителем данного дома");
target.ShowNotify(Notify.MessageType.Success, $"Вы являетесь сожителем дома {house.Id}. Владелец дома: {player.Name}");
house.UpdateMenuView(target);
}
break;
}
default:
throw new ArgumentOutOfRangeException();
}
}
[RemoteEvent("Interaction:Decline")]
public void InteractionDecline(Player target)
{
var interact = target.GetInteractModel();
target.StopInteract();
if(interact == null)
return;
var player = interact.Source;
if (player == null || !NAPI.Player.IsPlayerConnected(player))
{
target.ShowNotify(Notify.MessageType.Alert, "Инициатор события покинул сервер");
return;
}
player.StopInteract();
target.ShowNotify(Notify.MessageType.Success, $"Вы отклонили запрос на взаимодействие с игроком {player.Name}");
player.ShowNotify(Notify.MessageType.Error, $"Игрок {target.Name} не принял запрос на взаимодействие с вами");
}
[RemoteEvent("Interaction:NonAcceptInteract")]
public void NonAcceptInteract(Player player, int keyCode)
{
var key = (InteractKeys) keyCode;
player.StopNonAccept();
var profile = player.GetProfile();
if(profile == null)
return;
var nearAtm = player.GetNearAtm();
if (nearAtm != null)
{
// player.ShowNotify(Notify.MessageType.Success, $"Вы ткнули кнопку действия возле банкомата {nearAtm.Id}");
if (!player.DoesHaveDebitCards())
{
player.ShowNotify(Notify.MessageType.Error, "У вас нет банковской карточки!");
return;
}
nearAtm.ToggleMenu(player);
return;
}
var nearProductShop = player.GetNearProductShop();
if (nearProductShop != null)
{
nearProductShop.SyncClientData(player);
}
var nearClothesShop = player.GetNearClothesShop();
if (nearClothesShop != null)
{
nearClothesShop.SyncClientData(player);
}
var nearColumn = player.GetNearRefuelColumn();
if (nearColumn != null)
{
var station = nearColumn.Station;
if(station == null)
return;
var vehicle = nearColumn.GetVehicleNearColumnNearestPlayer(player);
if(vehicle == null)
return;
if(vehicle.GetInfo() == null || vehicle.DoesTemporary())
return;
station.SyncClientData(player, vehicle.GetInfo(), nearColumn.ColumnType == (int) ColumnType.Electric);
}
var nearHouse = player.GetNearHouse();
var house = nearHouse ?? player.GetInHouse();
if (house != null)
{
switch (key)
{
case InteractKeys.E:
{
if(nearHouse == null)
house.TryExit(player);
else
house.TryEnter(player, true);
break;
}
case InteractKeys.G:
house.ToggleMenu(player);
break;
default:
return;
}
return;
}
var nearGarage = player.GetNearGarage();
if (nearGarage != null)
{
if (nearGarage.House == null)
throw new Exception($"GARAGE DOESNT HAVE LINKED HOUSE");
if(!nearGarage.House.DoesOwner(profile.Id)
&& !nearGarage.House.DoesMate(profile))
return;
if (player.IsInVehicle && player.VehicleSeat == 0)
{
if(nearGarage.Capacity >= nearGarage.GetTotalVehiclesIn() + 1)
{
// TODO: поставить в гараж
var vehicle = player.Vehicle;
nearGarage.Put(vehicle);
nearGarage.House.ToggleMenu(player, false);
player.ShowNotify(Notify.MessageType.Success,
$"Вы успешно поставили свой {vehicle.DisplayName} в гараж {nearGarage.Id} дома №{nearGarage.House.Id}");
}
}
else
{
if (nearGarage.GetTotalVehiclesIn() > 0)
{
nearGarage.House.ToggleGarageMenu(player);
}
}
}
var nearShowroom = player.GetNearShowroom();
var showroom = nearShowroom ?? player.GetInShowroom();
if (showroom != null)
{
if (nearShowroom == null)
showroom.TurnOffMenu(player);
else
showroom.TurnOnMenu(player);
}
}
[RemoteEvent("Interact:Refresh")]
public void RefreshInteract(Player player)
{
if(player.GetProfile() == null)
return;
if(player.Dead)
return;
var nearAtm = player.GetNearAtm();
if (nearAtm != null)
{
player.SetInteractKey(new List<int>
{
(int) InteractKeys.E
});
return;
}
var nearColumn = player.GetNearRefuelColumn();
if (nearColumn != null)
{
player.SetInteractKey(new List<int>
{
(int) InteractKeys.E
});
return;
}
var house = player.GetNearHouse() ?? player.GetInHouse();
if (house != null)
{
player.SetInteractKey(new List<int>
{
(int) InteractKeys.E,
(int) InteractKeys.G,
});
return;
}
var showroom = player.GetNearShowroom() ?? player.GetInShowroom();
if (showroom != null)
{
player.SetInteractKey(new List<int>()
{
(int) InteractKeys.E
});
return;
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment