diff --git a/ReallifeGamemode.Client/index.ts b/ReallifeGamemode.Client/index.ts index 4b914084..a553d1ef 100644 --- a/ReallifeGamemode.Client/index.ts +++ b/ReallifeGamemode.Client/index.ts @@ -246,9 +246,11 @@ userhelp(globalData); import drivingschool from './Gui/drivingschool'; drivingschool(globalData); +import gangwarHandle from './util/Gangwar'; +gangwarHandle(globalData); + require('./Gui/policedepartment'); require('./Gui/helptext'); -require('./util/Gangwar'); interface VehicleData { EngineState: boolean; diff --git a/ReallifeGamemode.Client/util/Gangwar.ts b/ReallifeGamemode.Client/util/Gangwar.ts index 68d62d37..e4d7412b 100644 --- a/ReallifeGamemode.Client/util/Gangwar.ts +++ b/ReallifeGamemode.Client/util/Gangwar.ts @@ -1,334 +1,596 @@ -//GANGZONE EDITOR -var gzEdit = false; -var editVisualHelpX = 0.5; -var editVisualHelpY = 0.8; -var pointCounter = -1; -var editorState = 0; -var gangZoneMidHeight; -var helpScale = 0.1; -var editPoint = null; - -var colorG = [0, 255, 0, 255]; -var colorR = [255, 0, 0, 255]; -var colorW = [255, 255, 255, 255]; -var colorY = [245, 229, 27, 255]; -var pointColors = [colorW, colorR, colorR, colorR]; - -var gPoints; //Eckpunkte -var gZoneBorders; - -/* -class gPoint { - constructor(id: number, x: number, y: number) { } - id: number; - x: number; - y: number; -}*/ - -mp.events.add("SERVER:Load_Gangzone_Editor", () => { - /*if (gzEdit == false) { - - }*/ - reloadGangZoneEditor(); -}); - -function reloadGangZoneEditor() { - gzEdit = true; - pointCounter = -1; - gangZoneMidHeight = new mp.Vector3(0, 0, 0); - pointColors = [colorW, colorR, colorR, colorR]; - gPoints = new Array(); - editorState = 0; - editPoint = null; - gZoneBorders = new Array(); -} - -//TASTE NUM5 -mp.keys.bind(0x65, false, function () { - if (gzEdit) { - switch (editorState) { - case 0: - if (pointCounter < 0) { //Map-Höhe definieren - gangZoneMidHeight = mp.players.local.position; - } else { //Eckpunkte abspeichern - var newPoint = mp.players.local.position; - newPoint.z = gangZoneMidHeight.z; - gPoints.push(newPoint); - pointColors[pointCounter] = colorG; - pointColors[pointCounter + 1] = colorW; - } - pointCounter++; - if (pointCounter == 4) { //Alle Eckpunkte abgespeichert - editorState = 1; - } - break; - case 1: //Bearbeiteten Punkt abspeichern - var newPoint = mp.players.local.position; - newPoint.z = gangZoneMidHeight.z; - gPoints[editPoint - 1] = newPoint; - pointColors[editPoint - 1] = colorG; - editPoint = null; - break; +export default function gangwarHandle(globalData: IGlobalData) { + 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; + }; -//NUM0 -mp.keys.bind(0x60, false, function () { - if (gzEdit && editorState == 1 && editPoint == null) { - reloadGangZoneEditor(); - gzEdit = false; - } -}); + 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; + _marker: MarkerMp; + vector: Vector3Mp; + value: number; -//NUM1 -mp.keys.bind(0x61, false, function () { - if (gzEdit && editorState == 1) { - editPoint = 1; - pointColors[0] = colorY; - } -}); + _status: string; + _entered: boolean; + _isEntering: boolean; + _inColshape: boolean; + _timerCheck; + edit: boolean; + attackBlip: BlipMp; + leaderBlip: BlipMp; + leaderBlipVector: Vector3Mp; + leaderColShape: MarkerMp; -//NUM2 -mp.keys.bind(0x62, false, function () { - if (gzEdit && editorState == 1) { - editPoint = 2; - pointColors[1] = colorY; - } -}); - -//NUM3 -mp.keys.bind(0x63, false, function () { - if (gzEdit && editorState == 1) { - editPoint = 3; - pointColors[2] = colorY; - } -}); - -//NUM4 -mp.keys.bind(0x64, false, function () { - if (gzEdit && editorState == 1) { - editPoint = 4; - pointColors[3] = colorY; - } -}); - -//NUM7 -mp.keys.bind(0x67, false, function () { - if (gzEdit && editorState == 2) { - - } -}); - - -//NUM9 -mp.keys.bind(0x69, false, function () { - if (gzEdit && editorState == 2) { - - } -}); - - -function squarItUp() { - - /* A B - * - * D C - */ - - var A = gPoints[0]; - var B = gPoints[1]; - var C = gPoints[2]; - var D = gPoints[3]; - - var distAB = A - B; - var distBC = B - C; - var distCD = C - D; - var distDA = D - A; - - -} - -mp.events.add("render", () => { - if (gzEdit) { - if (pointCounter >= 0) { //Wenn Y-Spielhöhe definiert wurde - renderVisualHelp(); //Onscreen Texte - renderVisualWorld(); //RealWorld Geometrie - } else { //Ansonsten Spielhöhe definieren - renderGangzonePreSetup(); + constructor(name, id, x, y, range, color, rot, owner, edit, vector, value) { + this._setup(name, id, x, y, range, color, rot, owner, edit, vector, value); } - } - /*mp.game.graphics.drawText("GW-Edit DEBUG\n" + - "editorState: " + editorState + "\n" + - "pointCounter: " + pointCounter + "\n" - , [editVisualHelpX, 0.1], - { - font: 0, - color: [255, 255, 255, 255], - scale: [0.3, 0.3], - outline: true, - centre: false - }); - */ -}); - -function renderVisualHelp() { - if (gzEdit == true) { - if (editorState == 0) { - //Visualisierungshilfe zum erstelln von Gangzonen - mp.game.graphics.drawText("Speicher bitte Punkt ~y~" + (pointCounter + 1) + "~s~ ab. Taste ~g~NUM-5", [editVisualHelpX, editVisualHelpY], - { - font: 0, - color: [255, 255, 255, 255], - scale: [0.3, 0.3], - outline: true, - centre: false - }); - - mp.game.graphics.drawRect(editVisualHelpX, editVisualHelpY, helpScale * 2, helpScale * 2, 255, 255, 255, 150); - mp.game.graphics.drawText("1", [editVisualHelpX - helpScale, editVisualHelpY - helpScale - 0.025], - { - font: 0, - color: pointColors[0], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - - mp.game.graphics.drawText("2", [editVisualHelpX + helpScale, editVisualHelpY - helpScale - 0.025], - { - font: 0, - color: pointColors[1], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - - mp.game.graphics.drawText("3", [editVisualHelpX + helpScale, editVisualHelpY + helpScale], - { - font: 0, - color: pointColors[2], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - - mp.game.graphics.drawText("4", [editVisualHelpX - helpScale, editVisualHelpY + helpScale], - { - font: 0, - color: pointColors[3], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - } else if (editorState == 1) { - if (editPoint == null) { - mp.game.graphics.drawText("Welchen Eckpunkt möchtest du bearbeiten? \nDrücke ~g~NUM1-4\n"+ - "~s~Oder drücke ~g~NUM-0 ~s~ zum Beenden", [editVisualHelpX, editVisualHelpY], - { - font: 0, - color: [255, 255, 255, 255], - scale: [0.3, 0.3], - outline: true, - centre: false - }); - mp.game.graphics.drawRect(editVisualHelpX, editVisualHelpY, helpScale * 2, helpScale * 2, 255, 255, 255, 150); - mp.game.graphics.drawText("1", [editVisualHelpX - helpScale, editVisualHelpY - helpScale - 0.025], - { - font: 0, - color: pointColors[0], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - - mp.game.graphics.drawText("2", [editVisualHelpX + helpScale, editVisualHelpY - helpScale - 0.025], - { - font: 0, - color: pointColors[1], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - - mp.game.graphics.drawText("3", [editVisualHelpX + helpScale, editVisualHelpY + helpScale], - { - font: 0, - color: pointColors[2], - scale: [0.4, 0.4], - outline: true, - centre: false - }); - - mp.game.graphics.drawText("4", [editVisualHelpX - helpScale, editVisualHelpY + helpScale], - { - font: 0, - color: pointColors[3], - scale: [0.4, 0.4], - outline: true, - centre: false - }); + _setup(name, id, x, y, range, color, rot, owner, edit, vector, value) { + 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; + self.leaderBlip = null; + self.value = value; + if (vector != null) { + self.leaderBlipVector = JSON.parse(vector); } else { - mp.game.graphics.drawText("Du bearbeitest Eckpunkt ~y~" + editPoint + "~s~. Zum Speichern ~g~NUM-5", [editVisualHelpX, editVisualHelpY], - { - font: 0, - color: [255, 255, 255, 255], - scale: [0.3, 0.3], - outline: true, - centre: false - }); + self.leaderBlipVector = null; + } + + self.leaderColShape = 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; } } - } -} -function renderVisualWorld() { - var playerPosition = mp.players.local.position; - - if (pointCounter >= 1 && pointCounter < 4) { - mp.game.graphics.drawLine(gPoints[pointCounter - 1].x, gPoints[pointCounter - 1].y, gangZoneMidHeight.z, playerPosition.x, playerPosition.y, playerPosition.z, 255, 0, 0, 200); - } - - if (pointCounter > 1) mp.game.graphics.drawLine(gPoints[0].x, gPoints[0].y, gangZoneMidHeight.z, gPoints[1].x, gPoints[1].y, gangZoneMidHeight.z, 0, 255, 0, 200); - if (pointCounter > 2) mp.game.graphics.drawLine(gPoints[1].x, gPoints[1].y, gangZoneMidHeight.z, gPoints[2].x, gPoints[2].y, gangZoneMidHeight.z, 0, 255, 0, 200); - if (pointCounter > 3) { - mp.game.graphics.drawLine(gPoints[2].x, gPoints[2].y, gangZoneMidHeight.z, gPoints[3].x, gPoints[3].y, gangZoneMidHeight.z, 0, 255, 0, 200); - mp.game.graphics.drawLine(gPoints[3].x, gPoints[3].y, gangZoneMidHeight.z, gPoints[0].x, gPoints[0].y, gangZoneMidHeight.z, 0, 255, 0, 200); - } - - if (editorState == 1 && editPoint != null) { - mp.game.graphics.drawLine(gPoints[editPoint - 1].x, gPoints[editPoint - 1].y, gangZoneMidHeight.z, playerPosition.x, playerPosition.y, playerPosition.z, 255, 0, 0, 200); - } - - //QUADER - /* - if (pointCounter > 3) { - for (var x = 0; x < 4; x++) { - var newPoint = gPoints[0]; - newPoint.z += 5.0; - gPoints.push(newPoint); + scoreUpdate(attackerScore, defenderScore) { + mp.gui.chat.push(this.owner + " " + defenderScore + " : " + attackerScore + " " + this.attacker); } - for (var v = 4; v < 8; v++) { //Verdrahtung horizontal - if (v < 7) { - mp.game.graphics.drawLine(gPoints[v].x, gPoints[v].y, gPoints[v].z, gPoints[v + 1].x, gPoints[v + 1].y, gPoints[v + 1].z, 0, 255, 0, 200); - } else { - mp.game.graphics.drawLine(gPoints[v].x, gPoints[v].y, gPoints[v].z, gPoints[4].x, gPoints[4].y, gPoints[4].z, 0, 255, 0, 200); + 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); + //self.blip.setPosition(mp.players.local.position.x, mp.players.local.position.y, 1); + + 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; + } + //self.blip.setRotation(self.rotation); + mp.game.invoke(Natives.SET_BLIP_ROTATION, self.blip, self.rotation); } - mp.game.graphics.drawLine(gPoints[v].x, gPoints[v].y, gPoints[v].z, gPoints[v-4].x, gPoints[v-4].y, gPoints[v-4].z, 0, 255, 0, 200); //Verdrahtung Vertikal - } - }*/ -} -function renderGangzonePreSetup() { - mp.game.graphics.drawText("Stelle dich ungefähr in die Mitte der Gangzone um die Z-Koordinatenhöhe zu berechnen und drücke ~y~NUM5", [editVisualHelpX, editVisualHelpY - 0.05], - { - font: 0, - color: [255,255,255,255], - scale: [0.3, 0.3], - outline: true, - centre: false + 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 + }); + } + } + } + if (self.leaderBlipVector != null) { + let dist = mp.game.gameplay.getDistanceBetweenCoords(mp.players.local.position.x, mp.players.local.position.y, mp.players.local.position.z, self.leaderBlipVector.x, self.leaderBlipVector.y, self.leaderBlipVector.z, false); + if (self.isInsideArea() && self._status != "attack" && dist <= 6) { + if (self.leaderBlipVector != null) { + mp.game.graphics.drawText(self.name + "\n~y~Gang: ~s~" + self.owner + "\n~y~Wert: ~s~$~g~" + self.value, [self.leaderBlipVector.x, self.leaderBlipVector.y, self.leaderBlipVector.z], { + font: 7, + color: [255, 255, 255, 185], + scale: [0.4, 0.4], + outline: true, + centre: true + }); + } + } + } + } + + startGangWar() { + var self = this; + if (self._status == "normal") { + let dist = mp.game.gameplay.getDistanceBetweenCoords(mp.players.local.position.x, mp.players.local.position.y, 0, self.leaderBlipVector.x, self.leaderBlipVector.y, self.leaderBlipVector.z, false); + if (dist <= 3) { + mp.events.callRemote("SERVER:StartGangwar"); + } + } + } + + updateArea(status, ...args) { + var self = this; + if (status == "attack") { + if (self.leaderColShape != null) { + self.leaderColShape.destroy(); + self.leaderColShape = null; + } + self._status = "attack"; + self.attacker = args[1]; + //self.blip.setFlashes(true); + //mp.game.invoke(Natives.SET_BLIP_FLASHES, self.blip, true); + return; + } + if (status == "normal") { + self._status = "normal"; + //self.blip.setFlashes(false); + //mp.game.invoke(Natives.SET_BLIP_FLASHES, self.blip, false); + return; + } + if (status == "conquered") { + //mp.game.graphics.stopScreenEffect("MinigameTransitionIn"); + self._status = "normal"; + self.owner = args[0]; + self.attacker = null; + //self.blip.setFlashes(false); + //mp.game.invoke(Natives.SET_BLIP_FLASHES, self.blip, false); + + self.setColor(self.owner) + self.blip.setColour(self.color) + mp.game.invoke(Natives.SET_BLIP_COLOUR, self.blip, self.color); + self.setLeaderColShape(); + return; + } + } + + setAttackBlip(bool) { + var self = this; + if (bool) { + self.attackBlip = mp.game.ui.addBlipForCoord(self.x, self.y, 0); + 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); + } + } + + setLeaderBlip(bool) { + var self = this; + if (this.leaderColShape != null) { + this.leaderColShape.destroy(); + this.leaderColShape = null; + } + if (bool) { + self.leaderBlipVector = mp.players.local.position; + mp.events.callRemote("SERVER:Turf_SetNewLeaderPoint", JSON.stringify(self.leaderBlipVector), JSON.stringify(self.id)); + return; + } + + if (self.leaderBlipVector != null) { + self.leaderBlip = mp.game.ui.addBlipForRadius(self.leaderBlipVector.x, self.leaderBlipVector.y, 1, 60); + self.setLeaderColShape(); + mp.game.invoke(Natives.SET_BLIP_SPRITE, self.leaderBlip, 437); + mp.game.invoke(Natives.SET_BLIP_AS_SHORT_RANGE, self.leaderBlip, false); + } + } + + setLeaderColShape() { + var self = this; + let newVector = new mp.Vector3(self.leaderBlipVector.x, self.leaderBlipVector.y, self.leaderBlipVector.z - 2) + + self.leaderColShape = mp.markers.new(1, newVector, 2, { + color: [255, 255, 0, 150], + visible: true, + dimension: 0 + }); + } + + 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.stopScreenEffect("MinigameTransitionIn"); + //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; + } + + setValue(value) { + var self = this; + self.value = value; + } + } + + 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; + var y = 0; + var z = 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.invoke(Natives.SET_BLIP_SPRITE, last_blip, -1); + mp.game.ui.removeBlip(last_blip); + last_blip = mp.game.invoke(Natives.GET_NEXT_BLIP_INFO_ID, 5); + x++; + } + + let last_attackBlip = mp.game.invoke(Natives.GET_FIRST_BLIP_INFO_ID, 378); + while (mp.game.invoke(Natives.DOES_BLIP_EXIST, last_attackBlip)) { + mp.game.invoke(Natives.SET_BLIP_SPRITE, last_attackBlip, -1); + mp.game.ui.removeBlip(last_attackBlip); + last_attackBlip = mp.game.invoke(Natives.GET_NEXT_BLIP_INFO_ID, 378); + y++ + } + + let last_leaderBlip = mp.game.invoke(Natives.GET_FIRST_BLIP_INFO_ID, 437); + while (mp.game.invoke(Natives.DOES_BLIP_EXIST, last_leaderBlip)) { + mp.game.invoke(Natives.SET_BLIP_SPRITE, last_leaderBlip, -1); + mp.game.ui.removeBlip(last_leaderBlip); + last_leaderBlip = mp.game.invoke(Natives.GET_NEXT_BLIP_INFO_ID, 437); + mp.game.invoke(Natives.SET_BLIP_SPRITE, last_attackBlip, -1); + mp.game.ui.removeBlip(last_attackBlip); + last_attackBlip = mp.game.invoke(Natives.GET_NEXT_BLIP_INFO_ID, 378); + y++ + z++ + + } + mp.gui.chat.push("DEBUG: Turf blips not removed: " + x); + mp.gui.chat.push("DEBUG: Attack blips not removed: " + y); + mp.gui.chat.push("DEBUG: LeaderBlips blips not removed: " + z); + } + + mp.events.add('GangAreas:Create', (turfsJSON) => { + var turfs = JSON.parse(turfsJSON); + if (gangturfs.length > 0) { + gangturfs[gangturfs.length - 1].edit = false; + gangturfs.forEach(function (turf) { + turf._status = "disabled"; + turf.id = -420; //Due to garbage collecting this value needs to be negative, so that the Server doesn't find multiple Turfs in the Database with same ID's. + if (turf.leaderColShape != null) { + turf.leaderColShape.destroy(); + turf.leaderColShape = null; + } + if (turf._marker) + if (turf.blip != null) { + mp.game.ui.removeBlip(turf.blip); + } + if (turf.leaderBlip != null) { + mp.game.ui.removeBlip(turf.leaderBlip); + } + if (turf.attackBlip != null) { + mp.game.ui.removeBlip(turf.attackBlip); + } + }); + } + 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, turf.Vector, turf.Value); + } + }); + } + }); + + 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, null, 0); + }); + + 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); + } + }); + }); + + mp.events.add('CLIENT:Turf_LoadLeaderBlip', () => { + gangturfs.forEach(function (turf) { + turf.setLeaderBlip(false); + }); + }); + + mp.events.add('ADMIN:Turf_CreateLeaderBlip', () => { + gangturfs.forEach(function (turf) { + if (turf._entered == true) { + turf.setLeaderBlip(true); + } + }); + }); + + mp.events.add('CLIENT:StartGangwar', () => { + gangturfs.forEach(function (turf) { + if (turf._entered == true) { + turf.startGangWar(); + } + }); + }); + + mp.events.add('CLIENT:UpdateTurfValue', (jsonValues) => { + let values = JSON.parse(jsonValues); + for (var i = 0; i < gangturfs.length; i++) { + let turf = gangturfs[i]; + turf.setValue(values[i]); + turf.render(); + } + }); } \ No newline at end of file diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 42c7aeb3..05bc5f0a 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -1727,6 +1727,73 @@ namespace ReallifeGamemode.Server.Commands #region ALevel1337 + [Command("createturf", "~m~Benutzung:~s~ /createturf [radius]")] + public void CmdAdmCreateTurf(Player player, float option) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + player.TriggerEvent("ADMIN:CreateTurf", JsonConvert.SerializeObject(option)); + } + + [Command("setturf", "~m~Benutzung:~s~ /setturf (Name)")] + public void CmdAdmSetTurf(Player player, string name) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + player.TriggerEvent("ADMIN:SetTurf", name); + } + + [Command("cancleturf", "~m~Benutzung:~s~ /cancleturf")] + public void CmdAdmCancleTurf(Player player) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + Gangwar.Gangwar.loadPlayer(player); + } + + [Command("reloadturfs", "~m~Benutzung:~s~ /ReloadTurfs")] + public void CmdAdmReloadTurf(Player player) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + Gangwar.Gangwar.loadTurfs(); + Gangwar.Gangwar.loadTurfs_ToAllPlayers(); + } + + [Command("deleteturf", "~m~Benutzung:~s~ /DeleteTurfs")] + public void CmdAdmDeleteTurf(Player player) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + player.TriggerEvent("ADMIN:DeleteTurf"); + } + + [Command("setturfpoint", "~m~Benutzung:~s~ /setturfpoint")] + public void CmdAdmSetTurfPoint(Player player) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + player.TriggerEvent("ADMIN:Turf_CreateLeaderBlip"); + } + [Command("removewarn", "~m~Benutzung: ~s~/removewarn [Player] [Grund]", GreedyArg = true)] public void CmdAdminRemovewarn(Player player, string targetname, string reason) { @@ -3478,23 +3545,6 @@ namespace ReallifeGamemode.Server.Commands player.SendChatMessage("~m~Benutzung:~s~ /business [price] [Option]"); } - [Command("creategangzone", "~m~Benutzung:~s~ /creategangzone")] - public void CmdAdminCreateGangZone(Player player) - { - if (!player.GetUser()?.IsAdmin(AdminLevel.HEADADMIN) ?? true) - { - ChatService.NotAuthorized(player); - return; - } - - if (player.GetData("editmode") == false) - { - ChatService.SendMessage(player, "Bitte vorher den Edit-Mode aktivieren"); - return; - } - player.SendNotification("Gangzone-Editor aktiviert"); - player.TriggerEvent("SERVER:Load_Gangzone_Editor"); - } #endregion ALevel1337 #region ALevel1338 diff --git a/ReallifeGamemode.Server/Events/Death.cs b/ReallifeGamemode.Server/Events/Death.cs index b22f0c3e..365085c1 100644 --- a/ReallifeGamemode.Server/Events/Death.cs +++ b/ReallifeGamemode.Server/Events/Death.cs @@ -75,10 +75,10 @@ namespace ReallifeGamemode.Server.Events killerPosY = killer.Position.Y; killerPosZ = killer.Position.Z; killerHeading = killer.Heading; - /*if (player.HasData("inGangWar") && killer.HasData("inGangWar")) + if (player.HasData("inGangWar") && killer.HasData("inGangWar")) { Gangwar.Gangwar.GangwarKill(killer, player); - }*/ + } if (player != killer) { diff --git a/ReallifeGamemode.Server/Events/Login.cs b/ReallifeGamemode.Server/Events/Login.cs index 95c08bbd..7f4951a5 100644 --- a/ReallifeGamemode.Server/Events/Login.cs +++ b/ReallifeGamemode.Server/Events/Login.cs @@ -63,7 +63,7 @@ namespace ReallifeGamemode.Server.Events player.SetData("duty", false); player.SetData("Adminduty", false); player.TriggerEvent("SERVER:SET_HANDMONEY", user.Handmoney, 0); - //Gangwar.Gangwar.loadPlayer(player); + Gangwar.Gangwar.loadPlayer(player); if (user.FactionLeader) { player.TriggerEvent("CLIENT:Turf_LoadLeaderBlip"); diff --git a/ReallifeGamemode.Server/Gangwar/Gangwar.cs b/ReallifeGamemode.Server/Gangwar/Gangwar.cs index aca60dd3..0e0e798c 100644 --- a/ReallifeGamemode.Server/Gangwar/Gangwar.cs +++ b/ReallifeGamemode.Server/Gangwar/Gangwar.cs @@ -11,6 +11,219 @@ namespace ReallifeGamemode.Server.Gangwar { public class Gangwar : Script { + public static Turf[] _loadedTurfs; + private static List turfs; + public static void loadTurfs() + { + _loadedTurfs = null; + using (var context = new DatabaseContext()) + { + turfs = context.Turfs.Select(t => t).ToList(); + List turfing = new List(); + foreach (var t in turfs) + { + Turf newTurf = new Turf(t.Id, t.Name, t.Color, t.Owner, t.Value, t.MaxValue, t.Surplus); + turfing.Add(newTurf); + } + _loadedTurfs = turfing.ToArray(); + } + } + + public static void loadPlayer(Player client) + { + client.TriggerEvent("GangAreas:Create", JsonConvert.SerializeObject(turfs.ToArray())); + } + + public static void loadTurfs_ToAllPlayers() + { + NAPI.ClientEvent.TriggerClientEventForAll("GangAreas:Create", JsonConvert.SerializeObject(turfs.ToArray())); + foreach (var l in NAPI.Pools.GetAllPlayers()) + { + if (!l.IsLoggedIn() && !l.GetUser().FactionLeader) + return; + + l.TriggerEvent("CLIENT:Turf_LoadLeaderBlip"); + } + } + + public static void GangwarKill(Player killer, Player victim) + { + if (killer.HasData("GotInsideOfTurf") && victim.HasData("GotInsideOfTurf")) + { + foreach (var turf in getTurfs()) + { + if (turf.getId() == victim.GetData("inGangWar")) + { + turf.setKill(victim.GetUser().Faction.Name); + return; + } + } + } + } + + public static Turf[] getTurfs() + { + return _loadedTurfs; + } + + [RemoteEvent("Gangarea:Enter")] + public void RmtEvent_TurfEnter(Player client, string jsonId) + { + int id = JsonConvert.DeserializeObject(jsonId); + + foreach (var turf in getTurfs()) + { + if (turf.getId() == id) + { + turf.enter(client); + return; + } + } + } + + [RemoteEvent("Gangarea:Leave")] + public void RmtEvent_TurfLeave(Player client, string jsonId) + { + int id = JsonConvert.DeserializeObject(jsonId); + + foreach (var turf in getTurfs()) + { + if (turf.getId() == id) + { + turf.leave(client); + return; + } + } + } + + [RemoteEvent("SERVER:SetTurf")] + public void RmtEvent_SetTurf(Player client, string jsonX, string jsonY, string jsonRot, string jsonRange, string Name) + { + float pX = JsonConvert.DeserializeObject(jsonX); + float pY = (float)JsonConvert.DeserializeObject(jsonY); + float Rot = (float)JsonConvert.DeserializeObject(jsonRot); + float Range = (float)JsonConvert.DeserializeObject(jsonRange); + + var newTurf = new Turfs + { + Name = Name, + X = pX, + Y = pY, + Rotation = Rot, + Range = Range, + Owner = "Neutral", + Color = 0, + Vector = null + }; + using (var dbContext = new DatabaseContext()) + { + dbContext.Turfs.Add(newTurf); + dbContext.SaveChanges(); + } + loadTurfs(); + loadTurfs_ToAllPlayers(); + } + + [RemoteEvent("SERVER:DeleteTurf")] + public void RmtEvent_DeleteTurf(Player client, string jsonId) + { + int id = JsonConvert.DeserializeObject(jsonId); + if (id == -1) + { + ChatService.ErrorMessage(client, "Du befindest dich in keinem Gebiet!"); + return; + } + using (var dbContext = new DatabaseContext()) + { + Turfs dturf = dbContext.Turfs.Where(t => t.Id == id).FirstOrDefault(); + if (dturf != null) + { + dbContext.Turfs.Remove(dturf); + dbContext.SaveChanges(); + loadTurfs(); + loadTurfs_ToAllPlayers(); + } + } + } + + [RemoteEvent("SERVER:Turf_SetNewLeaderPoint")] + public void RmtEvent_SetNewLeaderPoint(Player client, string vector, string jsonId) + { + int id = JsonConvert.DeserializeObject(jsonId); + if (id == -1) + { + ChatService.ErrorMessage(client, "Du befindest dich in keinem Gebiet"); + return; + } + using (var dbContext = new DatabaseContext()) + { + Turfs dturf = dbContext.Turfs.Where(t => t.Id == id).FirstOrDefault(); + if (dturf != null) + { + dturf.Vector = vector; + dbContext.SaveChanges(); + loadTurfs(); + loadTurfs_ToAllPlayers(); + } + } + } + + [RemoteEvent("SERVER:StartGangwar")] + public void RmtEvent_StartGangwar(Player client) + { + if (!client.GetUser().FactionLeader) + return; + + foreach (var turf in getTurfs()) + { + if (turf.status == "attack") + { + ChatService.ErrorMessage(client, "Du kannst momentan kein Gangwar starten"); + return; + } + } + if (client.GetUser().Faction.Name == "Ballas" || client.GetUser().Faction.Name == "Grove") + { + foreach (var turf in getTurfs()) + { + foreach (var u in turf.playerInside) + { + if (u == client) + { + if (turf.Owner != client.GetUser().Faction.Name) + turf.attack(client.GetUser().Faction.Name); + } + } + } + } + } + + public static void Value_TimerElapsed() + { + List values = new List(); + using (var dbContext = new DatabaseContext()) + { + foreach (var turf in getTurfs()) + { + if ((turf.getValue() + 5) >= turf.getMaxValue()) + { + turf.setValue(turf.getMaxValue()); + } + else + { + turf.addValue(5); + } + values.Add(turf.getValue()); + Turfs _turf = dbContext.Turfs.Where(t => t.Id == turf.getId()).FirstOrDefault(); + _turf.Value = turf.getValue(); + } + dbContext.SaveChanges(); + } + NAPI.Task.Run(() => + { + NAPI.ClientEvent.TriggerClientEventForAll("CLIENT:UpdateTurfValue", JsonConvert.SerializeObject(values.ToArray())); + }); + } } } diff --git a/ReallifeGamemode.Server/Gangwar/Turf.cs b/ReallifeGamemode.Server/Gangwar/Turf.cs index 0595664b..d88fb37f 100644 --- a/ReallifeGamemode.Server/Gangwar/Turf.cs +++ b/ReallifeGamemode.Server/Gangwar/Turf.cs @@ -14,6 +14,339 @@ namespace ReallifeGamemode.Server.Gangwar { public class Turf { + public int TurfID { get; set; } + public string TurfName { get; set; } + public int Color { get; set; } + public string Owner { get; set; } + public string Attacker { get; set; } + public int Att_Score { get; set; } + public int Def_Score { get; set; } + public string status { get; set; } + public int value { get; set; } + public int maxValue { get; set; } + public bool surplus { get; set; } + public List playerInside { get; set; } + public Timer timer { get; set; } + public Player[] playerInGangwar { get; set; } + public int timerCount; + public Turf(int TurfID, string TurfName, int color, string Owner, int value, int maxValue, bool surplus) + { + this.TurfID = TurfID; + this.TurfName = TurfName; + this.Color = color; + this.Owner = Owner; + this.value = value; + this.maxValue = maxValue; + this.surplus = surplus; + this.Attacker = null; + this.Att_Score = 1; + this.Def_Score = 0; + this.status = "normal"; + this.timer = null; + this.playerInside = new List(); + this.timerCount = 0; + } + + public int getId() + { + return this.TurfID; + } + + public int getValue() + { + return this.value; + } + + public void setValue(int value) + { + this.value = value; + } + + public void addValue(int addedValue) + { + this.value += addedValue; + } + + public int getMaxValue() + { + return maxValue; + } + + public bool getSurplus() + { + return surplus; + } + + public void setSurplus(bool surplus) + { + this.surplus = surplus; + } + + public string getName() + { + return this.TurfName; + } + + public int getColor() + { + return this.Color; + } + + public string getOwner() + { + return this.Owner; + } + + public string getAttacker() + { + return this.Attacker; + } + + private void TurfTick() + { + this.timer = new System.Timers.Timer(1000); + + this.timer.Elapsed += Tick; + this.timer.AutoReset = true; + this.timer.Enabled = true; + this.timerCount = 0; + } + + private void Tick(object sender, System.Timers.ElapsedEventArgs e) + { + if (this.status == "attack") + { + update(); + } + } + + private void update() + { + #region Ticket system + + /* + try + { + Player[] owners = NAPI.Pools.GetAllPlayers().Where(c => c.GetUser().Faction.Name == this.Owner).ToArray(); + Player[] attackers = NAPI.Pools.GetAllPlayers().Where(c => c.GetUser().Faction.Name == this.Attacker).ToArray(); + }catch(NullReferenceException ex) + { + int i = 0; + foreach(var c in playerInGangwar) + { + if (!NAPI.Entity.DoesEntityExist(c.Handle)) + { + this.playerInside = this.playerInside.Where(gp => gp != c).ToArray(); + } + i++; + } + } + if (owners.Length > attackers.Length) + this.Att_Score -= owners.Length - attackers.Length; + if(owners.Length < attackers.Length) + this.Def_Score -= attackers.Length - owners.Length; + */ + + #endregion Ticket system + + foreach (Player gangwarPlayer in this.playerInGangwar) + { + gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, this.Att_Score, this.Def_Score, 900 - timerCount); + } + if (this.Att_Score >= 200) + { + this.takeOver(this.Attacker); + } + else if (this.Def_Score >= 200) + { + this.takeOver(this.Owner); + } + timerCount += 1; + if (timerCount >= 900) //change to 900 (seconds) before release for testing reasons change to whatever you like + { + if (this.Att_Score > this.Def_Score) + { + foreach (Player gangwarPlayer in this.playerInGangwar) + { + gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, 0, 0, 0); + } + this.takeOver(this.Attacker); + this.Def_Score = 0; + return; + } + else if (this.Att_Score < this.Def_Score) + { + foreach (Player gangwarPlayer in this.playerInGangwar) + { + gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, 0, 0, 0); + } + this.takeOver(this.Owner); + this.Att_Score = 0; + return; + } + else if (this.Def_Score == this.Att_Score) + { + foreach (Player gangwarPlayer in this.playerInGangwar) + { + gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, 0, 0, 0); + } + this.takeOver(this.Owner); + this.Def_Score = 0; + return; + } + } + } + + public void enter(Player client) + { + if (this.status == "attack") + { + if (client.GetUser().Faction.Name != getOwner() && client.GetUser().Faction.Name != getAttacker()) + return; + Player gPlayer = playerInGangwar.Where(c => c.GetUser().Id == client.GetUser().Id).FirstOrDefault(); + if (gPlayer == null) + { + using (var dbContext = new DatabaseContext()) + { + ChatService.BroadcastFaction("~y~[GANGWAR] ~r~" + client.Name + "~w~ ist nicht im Gangwar beteiligt !", dbContext.Factions.Where(f => f.Name == getOwner()).FirstOrDefault()); + ChatService.BroadcastFaction("~y~[GANGWAR] ~r~" + client.Name + "~w~ ist nicht im Gangwar beteiligt !", dbContext.Factions.Where(f => f.Name == getAttacker()).FirstOrDefault()); + } + return; + } + } + + if (playerInside.Find(c => c == client) == null) + { + playerInside.Add(client); + client.SetData("GotInsideOfTurf", true); + } + } + + public void leave(Player client) + { + if (playerInside.Find(c => c == client) != null) + { + this.playerInside = this.playerInside.Where(c => c != client).ToList(); + if (this.status != "attack") + client.ResetData("GotInsideOfTurf"); + } + } + + public void takeOver(string FactionName) + { + this.timer.Stop(); + this.timer = null; + using (var dbContext = new DatabaseContext()) + { + if (getOwner() == FactionName) + { + Player[] owners = NAPI.Pools.GetAllPlayers().Where(c => c.IsLoggedIn() && c.GetUser().Faction.Name == this.Owner).ToArray(); + Player[] attackers = NAPI.Pools.GetAllPlayers().Where(c => c.IsLoggedIn() && c.GetUser().Faction.Name == this.Attacker).ToArray(); + foreach (var o in owners) + { + o.TriggerEvent("CLIENT:win"); + } + foreach (var a in attackers) + { + a.TriggerEvent("CLIENT:loose"); + } + ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion hat erfolgreich das Gebiet ~g~" + getName() + "~w~ verteidigt.", dbContext.Factions.Where(f => f.Name == getOwner()).FirstOrDefault()); + ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion hat den Angrif auf das Gebiet ~r~" + getName() + "~w~ verloren.", dbContext.Factions.Where(f => f.Name == getAttacker()).FirstOrDefault()); + } + else if (getOwner() != FactionName) + { + ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion konnte das Gebiet ~r~" + getName() + "~w~ nicht verteidigen.", dbContext.Factions.Where(f => f.Name == getOwner()).FirstOrDefault()); + Player[] owners = NAPI.Pools.GetAllPlayers().Where(c => c.IsLoggedIn() && c.GetUser().Faction.Name == this.Owner).ToArray(); + Player[] attackers = NAPI.Pools.GetAllPlayers().Where(c => c.IsLoggedIn() && c.GetUser().Faction.Name == this.Attacker).ToArray(); + foreach (var o in owners) + { + o.TriggerEvent("CLIENT:loose"); + } + foreach (var a in attackers) + { + a.TriggerEvent("CLIENT:win"); + } + this.Owner = FactionName; + ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion konnte erfolgreich das Gebiet ~g~" + getName() + "~w~ erobern.", dbContext.Factions.Where(f => f.Name == getOwner()).FirstOrDefault()); + Turfs turf = dbContext.Turfs.Where(t => t.Id == getId()).FirstOrDefault(); + turf.Owner = this.Owner; + turf.FactionId = dbContext.Factions.Where(f => f.Name == this.Owner).FirstOrDefault().Id; + dbContext.SaveChanges(); + } + } + this.Attacker = null; + foreach (var c in playerInGangwar) + { + c.TriggerEvent("CLIENT:setAttackBlip", false, TurfID); + c.ResetData("inGangWar"); + c.ResetData("GotInsideOfTurf"); + } + this.playerInGangwar = null; + Gangwar.loadTurfs(); + Gangwar.loadTurfs_ToAllPlayers(); + } + + public void attack(string attacker) + { + Player[] usersInGangwar; + using (var context = new DatabaseContext()) + { + var onlinePlayers = NAPI.Pools.GetAllPlayers().Where(c => c.IsLoggedIn()).Select(c => c.Name); + + List ownersInGangwar = context.Users.Include(u => u.Faction).Where(u => onlinePlayers.Contains(u.Name) && u.Faction.Name == getOwner()).Select(u => u.Player).ToList(); + List attackersInGangwar = context.Users.Include(u => u.Faction).Where(u => onlinePlayers.Contains(u.Name) && u.Faction.Name == attacker).Select(u => u.Player).ToList(); + + if (ownersInGangwar.Count < 0 && attackersInGangwar.Count < 0) + { + List leaders = context.Users.Include(u => u.Faction).Where(u => onlinePlayers.Contains(u.Name) && u.Faction.Name == attacker && u.FactionLeader).Select(u => u.Player).ToList(); + foreach (var l in leaders) + { + ChatService.ErrorMessage(l, "Gangwarstart ist nicht möglich, da die beteiligten Fraktionen nicht genügend Mitglieder aufweisen."); + } + + return; + } + List inGangwar = new List(ownersInGangwar.Concat(attackersInGangwar)); + + usersInGangwar = inGangwar.ToArray(); + } + if (this.status == "normal") + { + if (this.timer != null) + { + this.timer.Stop(); + this.timer = null; + } + this.Attacker = attacker; + this.status = "attack"; + + List clientsInGangwar = new List(); + + foreach (var u in usersInGangwar) + { + u.TriggerEvent("CLIENT:setAttackBlip", true, TurfID); + u.TriggerEvent("GangwarScore", this.Attacker, this.Owner, this.Att_Score, this.Def_Score); + u.SetData("inGangWar", getId()); + ChatService.SendMessage(u, "~y~[GANGWAR]~w~ Die " + getAttacker() + " haben das Gebiet ~y~" + TurfName + "~w~ der " + getOwner() + " angegriffen."); + clientsInGangwar.Add(u); + } + playerInGangwar = clientsInGangwar.ToArray(); + NAPI.ClientEvent.TriggerClientEventForAll("CLIENT:Turf_Update", JsonConvert.SerializeObject(this.TurfID), JsonConvert.SerializeObject(this.status), JsonConvert.SerializeObject(this.Owner), JsonConvert.SerializeObject(this.Attacker)); + this.TurfTick(); + } + } + + public void setKill(string FactionName) + { + if (getOwner() == FactionName) + { + Att_Score += 1; + } + else if (getAttacker() == FactionName) + { + Def_Score += 1; + } + } } } diff --git a/ReallifeGamemode.Server/Main.cs b/ReallifeGamemode.Server/Main.cs index dc68e13c..e012348c 100644 --- a/ReallifeGamemode.Server/Main.cs +++ b/ReallifeGamemode.Server/Main.cs @@ -130,7 +130,7 @@ namespace ReallifeGamemode.Server //HouseManager.LoadHouses(); DrivingSchool.DrivingSchool.Setup(); PlaneSchool.Setup(); - //Gangwar.Gangwar.loadTurfs(); + Gangwar.Gangwar.loadTurfs(); Bank.bank.Setup(); Introduction.Setup(); diff --git a/ReallifeGamemode.Server/Util/ThreadTimers.cs b/ReallifeGamemode.Server/Util/ThreadTimers.cs index 5480f6d5..f5dd07ec 100644 --- a/ReallifeGamemode.Server/Util/ThreadTimers.cs +++ b/ReallifeGamemode.Server/Util/ThreadTimers.cs @@ -63,7 +63,7 @@ namespace ReallifeGamemode.Server.Util { WantedEscapeTimer.Timer_Elapsed(); Jail.JailIn_Elapsed(); - //Gangwar.Gangwar.Value_TimerElapsed(); + Gangwar.Gangwar.Value_TimerElapsed(); }); } }