continue Gangwar System

This commit is contained in:
Lukas Moungos
2019-11-30 18:54:11 +01:00
parent e3dbf7c4e1
commit a4303a1a01
14 changed files with 1904 additions and 6 deletions

BIN
Import/bridge.dll Normal file

Binary file not shown.

View File

@@ -29,6 +29,7 @@
<Folder Include="assets\html\Reportlist\" />
<Folder Include="assets\img\atm\" />
<Folder Include="assets\img\items\" />
<Folder Include="Gangwar\" />
</ItemGroup>
<ItemGroup>

View File

@@ -180,3 +180,6 @@ planeSchoolHandle(globalData);
import PilotRouteList from './Jobs/PilotRouteSelect';
PilotRouteList(globalData);
import gangwarHandle from './util/Gangwar';
gangwarHandle(globalData);

View File

@@ -0,0 +1,324 @@
export default function gangwarHandle(globalData: GlobalData) {
function inside(point, vs) {
let x = point[0],
y = point[1];
let inside = false;
for (let i = 0, j = vs.length - 1; i < vs.length; j = i++) {
let xi = vs[i][0],
yi = vs[i][1];
let xj = vs[j][0],
yj = vs[j][1];
let intersect = ((yi > y) != (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
if (intersect) inside = !inside;
}
return inside;
};
const Natives = {
SET_BLIP_CATEGORY: "0x234CDD44D996FD9A",
SHOW_HEADING_INDICATOR_ON_BLIP: "0x5FBCA48327B914DF",
SET_BLIP_AS_SHORT_RANGE: "0xBE8BE4FE60E27B72",
SET_BLIP_DISPLAY: "0x9029B2F3DA924928",
SET_BLIP_SPRITE: "0xDF735600A4696DAF",
SET_BLIP_ALPHA: "0x45FF974EEE1C8734",
ADD_BLIP_FOR_RADIUS: "0x46818D79B1F7499A",
SET_BLIP_COLOUR: "0x03D7FB09E75D6B7E",
SET_BLIP_ROTATION: "0xF87683CDF73C3F6E",
SET_BLIP_FLASHES: "0xB14552383D39CE3E",
GET_FIRST_BLIP_INFO_ID: "0x1BEDE233E6CD2A1F",
GET_NEXT_BLIP_INFO_ID: "0x14F96AA50D6FBEA7",
DOES_BLIP_EXIST: "0xA6DB27D19ECBB7DA"
};
var Gangturf = class {
name: string;
id: number;
range: number;
x: number;
y: number;
color: number;
colorZone_r: number;
colorZone_g: number;
colorZone_b: number;
rotation: number;
owner: string;
blip: BlipMp;
_colshape: ColshapeMp;
vector: Vector3Mp;
_status: string;
_entered: boolean;
_isEntering: boolean;
_inColshape: boolean;
_timerCheck;
edit: boolean;
constructor(name, id, x, y, range, color, rot, owner, edit) {
this._setup(name, id, x, y, range, color, rot, owner, edit);
}
_setup(name, id, x, y, range, color, rot, owner, edit) {
var self = this;
self.name = name;
self.id = id;
self.range = range;
if (owner = "Ballas") {
self.colorZone_r = 143;
self.colorZone_g = 0;
self.colorZone_b = 199;
} else if (owner = "GroveStreet") {
self.colorZone_r = 22;
self.colorZone_g = 87;
self.colorZone_b = 0;
} else if (owner = "Neutral") {
self.colorZone_r = 255;
self.colorZone_g = 255;
self.colorZone_b = 255;
}
self.color = color;
self.x = x;
self.y = y;
self.rotation = rot;
self._colshape = null;
self._status = "normal";
self._entered = false;
self._isEntering = false;
self._inColshape = false;
self._timerCheck;
self.owner = owner;
self.edit = edit;
self.loadArea();
}
loadArea() {
var self = this;
self.blip = mp.game.ui.addBlipForRadius(self.x, self.y, 1, self.range);
mp.game.invoke(Natives.SET_BLIP_SPRITE, self.blip, 5);
mp.game.invoke(Natives.SET_BLIP_ALPHA, self.blip, 70);
mp.game.invoke(Natives.SET_BLIP_COLOUR, self.blip, self.color);
self._colshape = mp.colshapes.newCircle(self.x, self.y, self.range * 1.5);
}
render() {
var self = this;
if (self.blip) {
mp.game.invoke(Natives.SET_BLIP_ROTATION, self.blip, self.rotation);
}
if (self._status == "attack") {
if (self.blip) {
if (mp.game.gameplay.getDistanceBetweenCoords(mp.players.local.position.x, mp.players.local.position.y, 0, self.x, self.y, 0, true) < self.range * 1.5) {
var range = Math.sqrt(((self.range * 1.2) * (self.range * 1.2)) + (((self.range * 1.2) / 2) * ((self.range * 1.2) / 2)));
let degrees = (self.rotation + 45) * (Math.PI / 180);
let top_right = {
x: self.x + range * Math.cos(degrees),
y: self.y + range * Math.sin(degrees)
}
degrees = (self.rotation + 135) * (Math.PI / 180);
let top_left = {
x: self.x + range * Math.cos(degrees),
y: self.y + range * Math.sin(degrees)
}
degrees = (self.rotation + 225) * (Math.PI / 180);
let bottom_left = {
x: self.x + range * Math.cos(degrees),
y: self.y + range * Math.sin(degrees)
}
degrees = (self.rotation + 315) * (Math.PI / 180);
let bottom_right = {
x: self.x + range * Math.cos(degrees),
y: self.y + range * Math.sin(degrees)
}
let z = mp.game.gameplay.getGroundZFor3dCoord(mp.players.local.position.x, mp.players.local.position.y, mp.players.local.position.z, 0, false);
//mp.game.graphics.drawLine(bottom_right.x, bottom_right.y, z, bottom_right.x, bottom_right.y, z + 25, 0, 255, 0, 255);
//mp.game.graphics.drawLine(top_left.x, top_left.y, z, top_left.x, top_left.y, z + 25, 0, 0, 255, 255);
let a = 0;
for (var i = z; i < z + 1; i += 0.001) {
mp.game.graphics.drawLine(top_left.x, top_left.y, i, top_right.x, top_right.y, i, self.colorZone_r, self.colorZone_g, self.colorZone_b, 60 - a * 100);
mp.game.graphics.drawLine(top_right.x, top_right.y, i, bottom_right.x, bottom_right.y, i, self.colorZone_r, self.colorZone_g, self.colorZone_b, 60 - a * 100);
mp.game.graphics.drawLine(bottom_right.x, bottom_right.y, i, bottom_left.x, bottom_left.y, i, self.colorZone_r, self.colorZone_g, self.colorZone_b, 60 - a * 100);
mp.game.graphics.drawLine(bottom_left.x, bottom_left.y, i, top_left.x, top_left.y, i, self.colorZone_r, self.colorZone_g, self.colorZone_b, 60 - a * 100);
a += 0.001
}
}
if (self.isInsideArea()) {
mp.game.graphics.drawText(self.name, [self.x, self.y, mp.players.local.position.z + 20], {
font: 7,
color: [255, 255, 255, 185],
scale: [0.4, 0.4],
outline: true,
centre: true
});
}
}
}
}
updateArea(status, ...args) {
var self = this;
if (status == "attack") {
self._status = "attack";
mp.game.invoke(Natives.SET_BLIP_FLASHES, self.blip, true);
return;
}
if (status == "normal") {
self._status = "normal";
mp.game.invoke(Natives.SET_BLIP_FLASHES, self.blip, false);
return;
}
if (status == "conquered") {
self._status = "normal";
self.owner = args[1];
mp.game.invoke(Natives.SET_BLIP_FLASHES, self.blip, false);
self.blip.setColour(args[0]);
return;
}
}
isTurfArea(shape) {
return (shape == this._colshape)
}
isOwner(gang) {
return (gang == this.owner)
}
check() {
var self = this
if (self._entered == true) {
if (!self.isInsideArea() || (self.isNearGround() == false)) {
self._entered = false;
// mp.events.callRemote("Gangarea:Leave", self.id);
}
}
}
enter() {
var self = this;
self._timerCheck = setInterval(function () {
if ((!self._entered)) {
if (self.isInsideArea() && (self.isNearGround() == true)) {
self._entered = true;
// mp.events.callRemote("Gangarea:Enter", self.id);
}
} else if (self._entered == true) {
if (!self.isInsideArea() || (self.isNearGround() == false)) {
self._entered = false;
//mp.events.callRemote("Gangarea:Leave", self.id);
}
}
}, 1000);
}
leave() {
var self = this;
clearInterval(self._timerCheck);
self.check();
}
isNearGround() {
let self = this;
let ground = mp.game.gameplay.getGroundZFor3dCoord(self.x, self.y, 9000, 0, false);
let max_diff = 75;
let dist = mp.game.system.vdist(0, 0, ground, 0, 0, mp.players.local.position.z);
if (dist <= max_diff) {
return true;
}
return false;
}
isInsideArea() {
var self = this;
let player = {
x: mp.players.local.position.x,
y: mp.players.local.position.y,
z: mp.players.local.position.z
};
var range = Math.sqrt(((self.range * 1.2) * (self.range * 1.2)) + (((self.range * 1.2) / 2) * ((self.range * 1.2) / 2)));
let degrees = (self.rotation + 45) * (Math.PI / 180);
let top_right = {
x: self.x + range * Math.cos(degrees),
y: self.y + range * Math.sin(degrees)
}
degrees = (self.rotation + 135) * (Math.PI / 180);
let top_left = {
x: self.x + range * Math.cos(degrees),
y: self.y + range * Math.sin(degrees)
}
degrees = (self.rotation + 225) * (Math.PI / 180);
let bottom_left = {
x: self.x + range * Math.cos(degrees),
y: self.y + range * Math.sin(degrees)
}
degrees = (self.rotation + 315) * (Math.PI / 180);
let bottom_right = {
x: self.x + range * Math.cos(degrees),
y: self.y + range * Math.sin(degrees)
}
let turf = [
[top_right.x, top_right.y],
[top_left.x, top_left.y],
[bottom_left.x, bottom_left.y],
[bottom_right.x, bottom_right.y]
]
if (inside([player.x, player.y], turf)) {
return true;
}
return false;
}
}
var gangturfs = [];
mp.events.add('playerEnterColshape', (shape) => {
let turfEntered;
gangturfs.forEach(function (turf) {
if (turf.isTurfArea(shape) == true) {
turfEntered = turf;
turfEntered.enter()
}
});
});
mp.events.add('playerExitColshape', (shape) => {
let turfExitted;
gangturfs.forEach(function (turf) {
if (turf.isTurfArea(shape) == true) {
turfExitted = turf;
turfExitted.leave()
}
});
});
mp.events.add('render', () => {
gangturfs.forEach(function (turf, id) {
turf.render();
});
});
function clearBlips() {
mp.game.gameplay.setThisScriptCanRemoveBlipsCreatedByAnyScript(true);
var x = 0;
let last_blip = mp.game.invoke(Natives.GET_FIRST_BLIP_INFO_ID, 5);
while (mp.game.invoke(Natives.DOES_BLIP_EXIST, last_blip)) {
mp.game.ui.removeBlip(last_blip);
last_blip = mp.game.invoke(Natives.GET_NEXT_BLIP_INFO_ID, 5);
}
}
mp.events.add('GangAreas:Create', (turfsJSON) => {
var turfs = JSON.parse(turfsJSON);
clearBlips();
if (turfs.length > 0) {
gangturfs = [];
turfs.forEach(function (turf) {
if (turf.Id != undefined) {
gangturfs[gangturfs.length] = new Gangturf(turf.Name, turf.Id, turf.X, turf.Y, turf.Range, turf.Color, turf.Rotation, turf.Owner);
}
});
}
});
}

View File

@@ -0,0 +1,31 @@
using GTANetworkAPI;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
namespace ReallifeGamemode.Database.Entities
{
public class Turfs
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[ForeignKey("Faction")]
public int? FactionId { get; set; }
public static Faction Faction { get; set; }
public string Owner { get; set; }
public string Name { get; set; }
public int X { get; set; }
public int Y { get; set; }
public int Rotation { get; set; }
public int Range { get; set; }
public int Color { get; set; }
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,37 @@
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
namespace ReallifeGamemode.Database.Migrations
{
public partial class Turfs : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Turfs",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
FactionId = table.Column<int>(nullable: true),
Owner = table.Column<string>(nullable: true),
Name = table.Column<string>(nullable: true),
X = table.Column<int>(nullable: false),
Y = table.Column<int>(nullable: false),
Rotation = table.Column<float>(nullable: false),
Range = table.Column<float>(nullable: false),
Color = table.Column<int>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Turfs", x => x.Id);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Turfs");
}
}
}

View File

@@ -890,6 +890,32 @@ namespace ReallifeGamemode.Database.Migrations
b.ToTable("TuningGarages");
});
modelBuilder.Entity("ReallifeGamemode.Database.Entities.Turfs", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd();
b.Property<int>("Color");
b.Property<int?>("FactionId");
b.Property<string>("Name");
b.Property<string>("Owner");
b.Property<float>("Range");
b.Property<float>("Rotation");
b.Property<int>("X");
b.Property<int>("Y");
b.HasKey("Id");
b.ToTable("Turfs");
});
modelBuilder.Entity("ReallifeGamemode.Database.Entities.User", b =>
{
b.Property<int>("Id")

View File

@@ -122,5 +122,8 @@ namespace ReallifeGamemode.Database.Models
//Driving/Bike/Flight School
public DbSet<Entities.SchoolVehicle> SchoolVehicles { get; set; }
//Gangwar
public DbSet<Entities.Turfs> Turfs { get; set; }
}
}

View File

@@ -52,7 +52,7 @@ namespace ReallifeGamemode.Server.Events
player.SetData("spec", true);
player.SetData("duty", false);
player.TriggerEvent("SERVER:SET_HANDMONEY", user.Handmoney, 0);
Gangwar.Gangwar.loadClient(player);
if (user.IsAdmin(AdminLevel.HEADADMIN) == true)
{
player.SetData("editmode", false);
@@ -102,8 +102,6 @@ namespace ReallifeGamemode.Server.Events
{
Jail.Check_PutBehindBars(player);
}
}
player.TriggerEvent("draw", player.Name, player.Handle.Value);

View File

@@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Text;
using GTANetworkAPI;
using System.Linq;
using ReallifeGamemode.Database.Models;
using ReallifeGamemode.Database.Entities;
using Newtonsoft.Json;
namespace ReallifeGamemode.Server.Gangwar
{
public class Gangwar
{
public static Turf[] _loadedTurfs;
private static List<Turfs> turfs;
public static void loadTurfs()
{
_loadedTurfs = null;
using (var context = new DatabaseContext())
{
turfs = context.Turfs.Select(t => t).ToList();
List<Turf> turfing = new List<Turf>();
foreach (var t in turfs)
{
Turf newTurf = new Turf(t.Id, t.Name, t.Color, t.Owner);
turfing.Add(newTurf);
}
_loadedTurfs = turfing.ToArray();
}
}
public static void loadClient(Client client)
{
client.TriggerEvent("GangAreas:Create", JsonConvert.SerializeObject(turfs.ToArray()));
}
public Turf[] getTurfs()
{
return _loadedTurfs;
}
}
}

View File

@@ -83,11 +83,23 @@ namespace ReallifeGamemode.Server.Gangwar
{
Client[] owners = this.playerInside.Where(c => c.GetUser().Faction.Name == this.Owner ).ToArray();
Client[] attackers = this.playerInside.Where(c => c.GetUser().Faction.Name == this.Attacker).ToArray();
/*
if (owners.Length > attackers.Length)
this.Att_Score -= owners.Length - attackers.Length;
if(owners.Length < attackers.Length)
this.Def_Score -= attackers.Length - owners.Length;
*/
foreach (Client playerInArea in this.playerInside)
{
playerInArea.TriggerEvent("CLIENT:Turf_Update", this.TurfID, this.status, this.Owner, this.Attacker, this.Color, this.Att_Score, this.Def_Score);
}
if(this.Def_Score <= 0)
{
this.takeOver(this.Attacker);
}else if(this.Att_Score <= 0)
{
this.takeOver(this.Owner);
}
}
public void enter(Client client)
@@ -107,6 +119,33 @@ namespace ReallifeGamemode.Server.Gangwar
this.playerInside = this.playerInside.Where(c => c != client).ToArray();
}
}
public void takeOver(string FactionName)
{
this.timer.Stop();
this.timer = null;
}
public void attack(Client client)
{
if(this.status == "normal")
{
if(this.timer != null)
{
this.timer.Stop();
this.timer = null;
}
this.Attacker = client.GetUser().Faction.Name;
this.status = "attack";
foreach(Client playerInArea in this.playerInside)
{
playerInArea.TriggerEvent("CLIENT:Turf_Update", this.TurfID, this.status, this.Owner, this.Attacker, this.Color, this.Att_Score, this.Def_Score);
}
this.TurfTick();
}
}
}
}

View File

@@ -62,6 +62,7 @@ namespace ReallifeGamemode.Server
HouseManager.LoadHouses();
DrivingSchool.DrivingSchool.Setup();
PlaneSchool.Setup();
Gangwar.Gangwar.loadTurfs();
TempBlip tempBlip = new TempBlip()
{

View File

@@ -723,8 +723,15 @@ namespace ReallifeGamemode.Server.Managers
Vector3 lastPosition = v.Position;
if (lastPositions.ContainsKey(v.Handle)) lastPosition = lastPositions[v.Handle];
lastPositions[v.Handle] = v.Position;
double distanceDriven = v.HasSharedData("drivenDistance") ? (double)v.GetSharedData("drivenDistance") : 0D;
double distanceDriven;
try
{
distanceDriven = v.HasSharedData("drivenDistance") ? (double)v.GetSharedData("drivenDistance") : 0D;
}
catch(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex)
{
distanceDriven = (double)0;
}
double distance = lastPosition.DistanceTo(v.Position) / 1000.0;
if (distance > 0.2) return;