UNPKG

@infernus/drift-detection

Version:

A wrapper of the popular SA-MP driftDetection library for samp-node.

2 lines (1 loc) 5.35 kB
import{defineEvent as d,PlayerEvent as T,PlayerStateEnum as c,GameMode as h,LimitsEnum as D}from"@infernus/core";const P=12,o=80,p=45,C=250,y=6;samp.defined||(samp.defined={}),samp.defined._drift_included=!0;var l=(t=>(t[t.TIMEOUT=0]="TIMEOUT",t[t.DAMAGED=1]="DAMAGED",t[t.OTHER=2]="OTHER",t))(l||{}),E=(t=>(t[t.NONE=0]="NONE",t[t.DRIFTING=1]="DRIFTING",t))(E||{}),i=(t=>(t[t.DRIFT_CHECK_ENABLED=1]="DRIFT_CHECK_ENABLED",t[t.DAMAGE_CHECK_ENABLED=2]="DAMAGE_CHECK_ENABLED",t))(i||{});class R{constructor(r){this.defaultValue=r}map=new Map;get size(){return this.map.size}get(r){return this.map.has(r)||this.map.set(r,this.defaultValue()),this.map.get(r)}set(r,e){return this.map.set(r,e),this}clear(){this.map.clear()}delete(r){return this.map.delete(r)}forEach(r,e){this.map.forEach(r,e)}has(r){return this.map.has(r)}[Symbol.iterator](){return this.map[Symbol.iterator]()}}const a={g_DriftPlayers:new R(()=>({vHealth:0,startPosX:0,startPosY:0,startPosZ:0,driftState:E.NONE,startTimestamp:0,lastTimestamp:0,timeoutTicks:0,playerFlags:i.DRIFT_CHECK_ENABLED|i.DAMAGE_CHECK_ENABLED})),g_DriftFlags:i.DRIFT_CHECK_ENABLED|i.DAMAGE_CHECK_ENABLED,g_MinDriftAngle:P,g_MinDriftSpeed:p,g_DriftTimeoutTicks:y};function I(t){return!([430,446,452,453,454,472,473,484,493,595].includes(t)||[448,461,462,463,468,471,481,509,510,521,522,523,581,586].includes(t)||[417,425,447,460,469,476,487,488,497,511,512,513,519,520,548,553,563,577,592,593].includes(t))}const[S,L]=d({name:"OnPlayerDriftStart",isNative:!1,beforeEach(t){return{player:t}}}),[H,B]=d({name:"OnPlayerDriftUpdate",isNative:!1,beforeEach(t,r,e,s){return{player:t,driftAngle:r,speed:e,time:s}}}),[G,f]=d({name:"triggerPlayerEnd",isNative:!1,beforeEach(t,r,e,s){return{player:t,reason:r,distance:e,time:s}}});T.onUpdate(({player:t,next:r})=>{const e=a.g_DriftPlayers.get(t);if(a.g_DriftFlags&i.DRIFT_CHECK_ENABLED&&e.playerFlags&i.DRIFT_CHECK_ENABLED&&Date.now()>e.lastTimestamp){const s=t.getVehicle();if(s&&t.getState()===c.DRIVER&&I(s.getModel())){const{x:A,y:M}=s.getVelocity(),u=s.getZAngle().angle,m=s.getSpeed(180);let _=Math.atan2(M,A)*180/Math.PI;_-=90,_<0&&(_+=360);let n=u-Math.abs(_);switch(n>270&&(n-=270),n<-270&&(n+=270),n=Math.abs(n),e.driftState){case E.NONE:{if(n>=a.g_MinDriftAngle&&n<=o&&m>=a.g_MinDriftSpeed){e.driftState=E.DRIFTING,e.startTimestamp=Date.now(),e.vHealth=s.getHealth().health;const{x:g,y:N,z:F}=t.getPos();e.startPosX=g,e.startPosY=N,e.startPosZ=F,L(t)}break}case E.DRIFTING:{if(a.g_DriftFlags&i.DAMAGE_CHECK_ENABLED&&e.playerFlags&i.DAMAGE_CHECK_ENABLED&&s.getHealth().health<e.vHealth){e.driftState=E.NONE,e.timeoutTicks=0;const g=t.getDistanceFromPoint(e.startPosX,e.startPosY,e.startPosZ);f(t,l.DAMAGED,g,Date.now()-e.startTimestamp)}if(n>=a.g_MinDriftAngle&&n<=o&&m>=a.g_MinDriftSpeed)e.timeoutTicks=0,B(t,n,m,Date.now()-e.startTimestamp);else if(e.timeoutTicks++,e.timeoutTicks>=a.g_DriftTimeoutTicks){e.driftState=E.NONE,e.timeoutTicks=0;const g=t.getDistanceFromPoint(e.startPosX,e.startPosY,e.startPosZ);f(t,l.TIMEOUT,g,Date.now()-e.startTimestamp)}break}}}e.lastTimestamp=Date.now()+C}return r()}),T.onStateChange(({player:t,oldState:r,next:e})=>{const s=a.g_DriftPlayers.get(t);if(s.driftState===E.DRIFTING&&r===c.DRIVER){s.driftState=E.NONE,s.timeoutTicks=0;const A=t.getDistanceFromPoint(s.startPosX,s.startPosY,s.startPosZ);f(t,l.OTHER,A,Date.now()-s.startTimestamp)}return e()}),T.onDisconnect(({player:t,next:r})=>{const e=a.g_DriftPlayers.get(t);if(e.driftState===E.DRIFTING){e.driftState=E.NONE,e.timeoutTicks=0;const s=t.getDistanceFromPoint(e.startPosX,e.startPosY,e.startPosZ);f(t,l.OTHER,s,Date.now()-e.startTimestamp)}return a.g_DriftPlayers.has(t)&&a.g_DriftPlayers.delete(t),r()}),h.onExit(({next:t})=>(a.g_DriftPlayers.clear(),t()));const K={setMinAngle(t){t<o&&(a.g_MinDriftAngle=t)},getMinAngle(){return a.g_MinDriftAngle},setMinSpeed(t){a.g_MinDriftSpeed=t},getMinSpeed(){return a.g_MinDriftSpeed},setTimeoutTicks(t){a.g_DriftTimeoutTicks=t},getTimeoutTicks(){return a.g_DriftTimeoutTicks},enableDetection(t=-1){t!==-1&&t.id>=0&&t.id<D.MAX_PLAYERS?a.g_DriftPlayers.get(t).playerFlags|=i.DRIFT_CHECK_ENABLED:a.g_DriftFlags|=i.DRIFT_CHECK_ENABLED},disableDetection(t=-1){t!==-1&&t.id>0&&t.id<D.MAX_PLAYERS?a.g_DriftPlayers.get(t).playerFlags&=~i.DRIFT_CHECK_ENABLED:a.g_DriftFlags&=~i.DRIFT_CHECK_ENABLED},isDetectionEnabled(t=-1){return t!==-1&&t.id>0&&t.id<D.MAX_PLAYERS?!!(a.g_DriftPlayers.get(t).playerFlags&i.DRIFT_CHECK_ENABLED):!!(a.g_DriftFlags&i.DRIFT_CHECK_ENABLED)},enableDamageCheck(t=-1){t!==-1&&t.id>0&&t.id<D.MAX_PLAYERS?a.g_DriftPlayers.get(t).playerFlags|=i.DAMAGE_CHECK_ENABLED:a.g_DriftFlags|=i.DAMAGE_CHECK_ENABLED},disableDamageCheck(t=-1){t!==-1&&t.id>0&&t.id<D.MAX_PLAYERS?a.g_DriftPlayers.get(t).playerFlags&=~i.DAMAGE_CHECK_ENABLED:a.g_DriftFlags&=~i.DAMAGE_CHECK_ENABLED},isDamageCheckEnabled(t=-1){return t!==-1&&t.id>0&&t.id<D.MAX_PLAYERS?!!(a.g_DriftPlayers.get(t).playerFlags&i.DAMAGE_CHECK_ENABLED):!!(a.g_DriftFlags&i.DAMAGE_CHECK_ENABLED)},isPlayerDrifting(t){return a.g_DriftPlayers.has(t)&&!!a.g_DriftPlayers.get(t).driftState}},O={onPlayerStart:S,onPlayerUpdate:H,onPlayerEnd:G};export{C as DRIFT_PROCESS_INTERVAL,y as DRIFT_TIMEOUT_INTERVAL,K as Drift,l as DriftEndReasonEnum,O as DriftEvent,i as DriftOptionsEnum,E as DriftStateEnum,o as MAX_DRIFT_ANGLE,P as MIN_DRIFT_ANGLE,p as MIN_DRIFT_SPEED};