From b500ef436dc0773591040797d29d13f083a9b6cc Mon Sep 17 00:00:00 2001 From: logsol Date: Thu, 29 May 2014 20:27:41 +0200 Subject: [PATCH] added areaSensor to doll and not allowing client to update position when another player is nearby --- app/Game/Channel/Control/PlayerController.js | 6 +-- app/Game/Channel/GameObjects/Doll.js | 9 ++++- app/Game/Client/GameController.js | 14 ++++--- app/Game/Client/Me.js | 27 +++++++++---- app/Game/Core/GameObjects/Doll.js | 40 ++++++++++++++++++++ 5 files changed, 78 insertions(+), 18 deletions(-) diff --git a/app/Game/Channel/Control/PlayerController.js b/app/Game/Channel/Control/PlayerController.js index fa596bf..1376bcb 100755 --- a/app/Game/Channel/Control/PlayerController.js +++ b/app/Game/Channel/Control/PlayerController.js @@ -40,7 +40,7 @@ function(Parent, Nc, Parser, Settings) { this.player.suicide(); }; - PlayerController.prototype.meStateUpdate = function(update) { + PlayerController.prototype.mePositionStateUpdate = function(update) { if(!this.player.doll) { console.warn('me state update, even though doll does not exist'); @@ -54,10 +54,10 @@ function(Parent, Nc, Parser, Settings) { if(difference.x < Settings.PUNKBUSTER_DIFFERENCE_METERS || difference.y < Settings.PUNKBUSTER_DIFFERENCE_METERS) { - this.player.doll.body.SetAwake(true); - this.player.doll.body.SetPosition(update.p); + this.player.doll.updatePositionState(update.p); } else { // HARD UPDATE FOR SELF + console.log(this.player.user.options.nickname + ' is cheating.') } }; diff --git a/app/Game/Channel/GameObjects/Doll.js b/app/Game/Channel/GameObjects/Doll.js index 34014e3..b0e3d53 100755 --- a/app/Game/Channel/GameObjects/Doll.js +++ b/app/Game/Channel/GameObjects/Doll.js @@ -74,7 +74,14 @@ function (Parent, Item, Box2D, Nc) { } } } + + Doll.prototype.updatePositionState = function(positionState) { + if(!this.isAnotherPlayerNearby()) { + this.body.SetAwake(true); + this.body.SetPosition(positionState); + } + }; return Doll; - + }); \ No newline at end of file diff --git a/app/Game/Client/GameController.js b/app/Game/Client/GameController.js index 990370a..6121033 100755 --- a/app/Game/Client/GameController.js +++ b/app/Game/Client/GameController.js @@ -54,7 +54,7 @@ function (Parent, Box2D, PhysicsEngine, ViewManager, PlayerController, Nc, reque if(this.me) { this.me.update(); - this.localMePositionUpdate(); + this.mePositionStateUpdate(); } for (var i = 0; i < this.gameObjects.animated.length; i++) { @@ -66,9 +66,9 @@ function (Parent, Box2D, PhysicsEngine, ViewManager, PlayerController, Nc, reque DomController.statsEnd(); } - GameController.prototype.localMePositionUpdate = function() { - if(this.me.isStateUpdateNeeded()) { - Nc.trigger(Nc.ns.client.to.server.gameCommand.send, "meStateUpdate", this.me.getStateUpdate()); + GameController.prototype.mePositionStateUpdate = function() { + if(this.me.isPositionStateUpdateNeeded()) { + Nc.trigger(Nc.ns.client.to.server.gameCommand.send, "mePositionStateUpdate", this.me.getPositionStateUpdate()); } }; @@ -119,8 +119,10 @@ function (Parent, Box2D, PhysicsEngine, ViewManager, PlayerController, Nc, reque if (gameObject instanceof Doll) { if(gameObject === this.me.doll) { - this.me.setLastServerState(update); - continue; // this is to ignore own doll updates from world update + this.me.setLastServerPositionState(update); + if(!this.me.acceptPositionStateUpdateFromServer()) { + continue; // this is to ignore own doll updates from world update + } } gameObject.setActionState(update.as); gameObject.lookAt(update.laxy.x, update.laxy.y); diff --git a/app/Game/Client/Me.js b/app/Game/Client/Me.js index d49bf08..89cb98a 100644 --- a/app/Game/Client/Me.js +++ b/app/Game/Client/Me.js @@ -8,7 +8,7 @@ function (Parent, Settings) { function Me(id, physicsEngine, user) { Parent.call(this, id, physicsEngine, user); - this.lastServerState = { + this.lastServerPositionState = { p: { x: 0, y: 0 @@ -18,17 +18,23 @@ function (Parent, Settings) { Me.prototype = Object.create(Parent.prototype); - Me.prototype.setLastServerState = function(update) { - this.lastServerState = update; + Me.prototype.setLastServerPositionState = function(update) { + this.lastServerPositionState = update; }; - Me.prototype.isStateUpdateNeeded = function() { + Me.prototype.isPositionStateUpdateNeeded = function() { - if(!this.doll) return false; + if(!this.doll) { + return false; + } + + if(this.doll.isAnotherPlayerNearby()) { + return false; + } var difference = { - x: Math.abs(this.lastServerState.p.x - this.doll.body.GetPosition().x), - y: Math.abs(this.lastServerState.p.y - this.doll.body.GetPosition().y) + x: Math.abs(this.lastServerPositionState.p.x - this.doll.body.GetPosition().x), + y: Math.abs(this.lastServerPositionState.p.y - this.doll.body.GetPosition().y) } if(difference.x > Settings.ME_STATE_MAX_DIFFERENCE_METERS @@ -39,13 +45,18 @@ function (Parent, Settings) { return false; }; - Me.prototype.getStateUpdate = function() { + Me.prototype.getPositionStateUpdate = function() { return { p: this.doll.body.GetPosition().Copy(), lv: this.doll.body.GetLinearVelocity().Copy() } }; + Me.prototype.acceptPositionStateUpdateFromServer = function() { + // gamecontroller should accept me's doll update only when another players doll is nearby. + return this.doll.isAnotherPlayerNearby(); + }; + return Me; }); \ No newline at end of file diff --git a/app/Game/Core/GameObjects/Doll.js b/app/Game/Core/GameObjects/Doll.js index ea1ed30..b0aa452 100755 --- a/app/Game/Core/GameObjects/Doll.js +++ b/app/Game/Core/GameObjects/Doll.js @@ -17,6 +17,7 @@ function (Parent, Box2D, Settings, CollisionDetector, Item, Nc) { this.width = 9; this.headHeight = 12; this.reachDistance = 20; + this.areaSize = 25; Parent.call(this, physicsEngine, uid); @@ -30,6 +31,7 @@ function (Parent, Box2D, Settings, CollisionDetector, Item, Nc) { left: [], right: [] }; + this.nearbyDolls = []; this.holdingJoint = null; this.holdingItem = null; @@ -141,6 +143,40 @@ function (Parent, Box2D, Settings, CollisionDetector, Item, Nc) { } this.body.CreateFixture(fixtureDef); + + // Area Sensor + var areaSensorShape = new Box2D.Collision.Shapes.b2PolygonShape(); + areaSensorShape.SetAsOrientedBox( + (this.width + this.areaSize) / 2 / Settings.RATIO, + (this.height + this.areaSize) / 2 / Settings.RATIO, + new Box2D.Common.Math.b2Vec2( + 0, + -this.height / 2 / Settings.RATIO + ) + ); + fixtureDef.shape = areaSensorShape; + fixtureDef.isSensor = true; + + fixtureDef.userData = { + onCollisionChange: function(isColliding, fixture) { + var userData = fixture.GetBody().GetUserData() + if(userData instanceof Doll) { + var doll = userData; + var i = this.nearbyDolls.indexOf(doll); + if(isColliding) { + if(i === -1) { + this.nearbyDolls.push(doll); + } + } else { + if(i !== -1) { + this.nearbyDolls.slice(i, 1); + } + } + } + } + } + + this.body.CreateFixture(fixtureDef); } Doll.prototype.setActionState = function(state) { @@ -323,6 +359,10 @@ function (Parent, Box2D, Settings, CollisionDetector, Item, Nc) { item.throw(x, y); }; + Doll.prototype.isAnotherPlayerNearby = function() { + return this.nearbyDolls.length > 0; + }; + Doll.prototype.onFootSensorDetection = function(isColliding, fixture) { var hasJumpStartVelocity = this.body.GetLinearVelocity().y < -Settings.JUMP_SPEED;