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", SET_BLIP_COORDS: "0xAE2AF67E9D9AF65D" }; 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; attacker: string; blip: BlipMp; _colshape: ColshapeMp; vector: Vector3Mp; _status: string; _entered: boolean; _isEntering: boolean; _inColshape: boolean; _timerCheck; edit: boolean; attackBlip: BlipMp; 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; self.setColor(owner); 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.attacker = null; self.edit = edit; self.loadArea(); self.attackBlip = null; } setColor(owner) { var self = this; if (owner === "Ballas") { self.color = 83; self.colorZone_r = 143; self.colorZone_g = 0; self.colorZone_b = 199; } else if (owner === "Grove") { self.color = 2; self.colorZone_r = 22; self.colorZone_g = 87; self.colorZone_b = 0; } else if (owner === "Neutral") { self.color = 0; self.colorZone_r = 255; self.colorZone_g = 255; self.colorZone_b = 255; } } scoreUpdate(attackerScore, defenderScore) { mp.gui.chat.push(this.owner + " " + defenderScore + " : " + attackerScore + " " + this.attacker); } 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._colshape) { if (self.edit == true) { let vector3 = mp.players.local.getRotation(2); self.rotation = Math.round(vector3.z); mp.game.invoke(Natives.SET_BLIP_COORDS, self.blip, mp.players.local.position.x, mp.players.local.position.y, 1); self.x = mp.players.local.position.x; self.y = mp.players.local.position.y; } mp.game.invoke(Natives.SET_BLIP_ROTATION, self.blip, self.rotation); } if (self._status == "attack" || self.edit == true) { if (self._colshape) { 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); if (self.edit) { 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); for (var i = z; i < z + 25; i += 0.5) { mp.game.graphics.drawLine(top_left.x, top_left.y, i, top_right.x, top_right.y, i, 255, 0, 0, 255); mp.game.graphics.drawLine(top_right.x, top_right.y, i, bottom_right.x, bottom_right.y, i, 255, 0, 0, 255); mp.game.graphics.drawLine(bottom_right.x, bottom_right.y, i, bottom_left.x, bottom_left.y, i, 255, 0, 0, 255); mp.game.graphics.drawLine(bottom_left.x, bottom_left.y, i, top_left.x, top_left.y, i, 255, 0, 0, 255); } } else { /* 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"; self.attacker = args[1]; 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[0]; self.attacker = null; mp.game.invoke(Natives.SET_BLIP_FLASHES, self.blip, false); self.setColor(self.owner) mp.game.invoke(Natives.SET_BLIP_COLOUR, self.blip, self.color); return; } } setAttackBlip(bool) { var self = this; if (bool) { self.attackBlip = mp.game.ui.addBlipForRadius(self.x, self.y, 1, 60); mp.game.invoke(Natives.SET_BLIP_SPRITE, self.attackBlip, 378); mp.game.invoke(Natives.SET_BLIP_AS_SHORT_RANGE, self.attackBlip, false); } else if (!bool) { mp.game.invoke(Natives.SET_BLIP_SPRITE, self.attackBlip, 5); } } 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; if (self._status === "attack") { mp.game.audio.playSoundFrontend(1, "Enter_Capture_Zone", "DLC_Apartments_Drop_Zone_Sounds", true); mp.game.graphics.startScreenEffect("MinigameTransitionOut", 500, false); } mp.events.callRemote("Gangarea:Enter", JSON.stringify(self.id)); } } else if (self._entered == true) { if (!self.isInsideArea() || (self.isNearGround() == false)) { self._entered = false; if (self._status === "attack") { mp.game.audio.playSoundFrontend(1, "Exit_Capture_Zone", "DLC_Apartments_Drop_Zone_Sounds", true); mp.game.graphics.startScreenEffect("MinigameTransitionIn", 500, false); } mp.events.callRemote("Gangarea:Leave", JSON.stringify(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(); }); }); mp.events.add('CLIENT:loose', () => { mp.game.audio.playSoundFrontend(1, "Zone_Enemy_Capture", "DLC_Apartments_Drop_Zone_Sounds", true); }); mp.events.add('CLIENT:win', () => { mp.game.audio.playSoundFrontend(1, "Zone_Team_Capture", "DLC_Apartments_Drop_Zone_Sounds", true); }); 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); if (gangturfs.length > 0) { gangturfs[gangturfs.length - 1].edit = false; } 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, false); } }); } }); mp.events.add('ADMIN:CreateTurf', (rangeJSON) => { var range = JSON.parse(rangeJSON); gangturfs[gangturfs.length] = new Gangturf("Reload For Name", -1, mp.players.local.position.x, mp.players.local.position.y, range, 0, mp.players.local.getHeading(), "Neutral", true); }); mp.events.add('ADMIN:SetTurf', (name) => { gangturfs[gangturfs.length - 1].edit = false; if (gangturfs[gangturfs.length - 1].id == -1) { mp.events.callRemote("SERVER:SetTurf", JSON.stringify(gangturfs[gangturfs.length - 1].x), JSON.stringify(gangturfs[gangturfs.length - 1].y), JSON.stringify(gangturfs[gangturfs.length - 1].rotation), JSON.stringify(gangturfs[gangturfs.length - 1].range), name); } }); mp.events.add('ADMIN:DeleteTurf', () => { gangturfs.forEach(function (turf) { if (turf._entered == true) { mp.events.callRemote("SERVER:DeleteTurf", JSON.stringify(turf.id)); return; } }); mp.events.callRemote("SERVER:DeleteTurf", JSON.stringify(-1)); }); mp.events.add('CLIENT:Turf_Update', (jsonId, jsonStatus, jsonOwner, jsonAttacker) => { var id = JSON.parse(jsonId); var status = JSON.parse(jsonStatus); var owner = JSON.parse(jsonOwner); var attacker = JSON.parse(jsonAttacker); gangturfs.forEach(function (turf) { if (turf.id == id) { turf.updateArea(status, owner, attacker); } }); }); mp.events.add('CLIENT:setAttackBlip', (bool, id) => { gangturfs.forEach(function (turf) { if (turf.id == id) { turf.setAttackBlip(bool); } }); }); }