diff --git a/apps/auth-user/src/modules/auth/services/auth-google-exchange.service.ts b/apps/auth-user/src/modules/auth/services/auth-google-exchange.service.ts index d8f1e354..566647b5 100644 --- a/apps/auth-user/src/modules/auth/services/auth-google-exchange.service.ts +++ b/apps/auth-user/src/modules/auth/services/auth-google-exchange.service.ts @@ -387,7 +387,6 @@ export class AuthGoogleExchangeService { }; } - private async initPlayerStats(user: ExchangeResult['user']): Promise { const payload: Record = { userId: user.id, diff --git a/apps/frontend/lib/babylon/data/achievments.ts b/apps/frontend/lib/babylon/data/achievments.ts index d5273b20..8d6a1e7f 100644 --- a/apps/frontend/lib/babylon/data/achievments.ts +++ b/apps/frontend/lib/babylon/data/achievments.ts @@ -1,25 +1,26 @@ - export class Achievements { - - private achievements: any = - { + public achievements: Record = { "marathon-mayem": false, "the early bird catches the worm!": false, "first blood!": false, "jump, JUMP, JUMP!!!": false, "eagle eye": false, - "chip-in!": false - } + "chip-in!": false, + }; - private distanceCounter: number = 0; - private marathonDistance: number = 20; + private distanceCounter = 0; + private marathonDistance = 20; + private userId: string; - constructor() {} + constructor(userId: string) { + this.userId = userId; + console.log(this.userId); + } - addToDistance(amount: number){ + async addToDistance(amount: number) { this.distanceCounter += amount; - if (this.distanceCounter >= this.marathonDistance && !this.achievements["marathon-mayem"]) - { + + if (this.distanceCounter >= this.marathonDistance && !this.achievements["marathon-mayem"]) { this.achievements["marathon-mayem"] = true; console.log("achievement unlocked!: marathon-mayem"); } diff --git a/apps/frontend/lib/babylon/gui/GuiHelper.ts b/apps/frontend/lib/babylon/gui/GuiHelper.ts index 6162fea9..7df683bd 100644 --- a/apps/frontend/lib/babylon/gui/GuiHelper.ts +++ b/apps/frontend/lib/babylon/gui/GuiHelper.ts @@ -7,6 +7,10 @@ import type { msgToServerType } from '@/lib/packets/msgToServerType'; import { stateUi } from '../state/state_ui/stateUi'; import { GameNotifications } from "../gui/GameNotifications"; import { SocketStatus } from "./SocketStatus"; +import { StateMachine } from "../state/StateMachine"; +import { Achievement } from "next-auth/providers/42-school"; +import { Achievements } from "../data/achievments"; +import { distance } from "framer-motion"; export class GuiHelper { public socketStatus: SocketStatus; @@ -15,12 +19,13 @@ export class GuiHelper { public notifications: GameNotifications; private resizeFunctions: Array<() => void> = []; constructor( + machine: StateMachine, scene: Scene, canvas: HTMLCanvasElement, clientId: string, msgToServer: msgToServerType ) { - const count = 0; + let count = 0; // Text hitboxes may overlap with buttons and take over control // GUI for non-interactable text @@ -47,6 +52,16 @@ export class GuiHelper { msgToServer(CS_Type.CS_DEV_StartEndscreen, { won: false, winnerId: clientId, + payload: { + userId: machine.userId, + type: "marathon-mayem" , + name: "Marathon Mayem", + description: "Travel 20 meters total", + achieved: machine.achievements.achievements["marathon-mayem"], + progress: 10, + progressTarget: 50, + meta: { distance: 8 } + }, }); }); this.resizeFunctions.push(() => { diff --git a/apps/frontend/lib/babylon/state/4_turn_start/Turn.ts b/apps/frontend/lib/babylon/state/4_turn_start/Turn.ts index 7f1c7eb7..9f29595f 100644 --- a/apps/frontend/lib/babylon/state/4_turn_start/Turn.ts +++ b/apps/frontend/lib/babylon/state/4_turn_start/Turn.ts @@ -6,6 +6,7 @@ import { StateMachine } from "../StateMachine"; import { ImportMesh } from "../1_loading/ImportMesh"; import { aimingMeshes } from "../1_loading/loadGame"; import { DotTail } from "../1_loading/DotTail"; +import { Projectile } from "../8_turn_end/Projectile"; const pi2 = Math.PI * 2; diff --git a/apps/frontend/lib/babylon/state/6_movement/movementTick.ts b/apps/frontend/lib/babylon/state/6_movement/movementTick.ts index 53f77823..de7d0ae3 100644 --- a/apps/frontend/lib/babylon/state/6_movement/movementTick.ts +++ b/apps/frontend/lib/babylon/state/6_movement/movementTick.ts @@ -83,13 +83,19 @@ function forAllWorms( // Remove gravity if on ground if (worm.onGround) + { + // console.log("My Gravity is 0!"); worm.aggregate.body.setGravityFactor(0); + } else + { + // console.log("My Gravity is 1!"); worm.aggregate.body.setGravityFactor(1); - // When player is moving, send packet to update clients and server with that players position - if (isActive && isMovement && worm.aggregate.body.getLinearVelocity().length() > 0.01) { - broadcastPosition(worm.id, worm.collider.position.x, worm.collider.position.y); + // When player is moving, send packet to update clients and server with that players position + if (isActive && isMovement && worm.aggregate.body.getLinearVelocity().length() > 0.01) { + broadcastPosition(worm.id, worm.collider.position.x, worm.collider.position.y); + } } } diff --git a/apps/frontend/lib/babylon/state/7_aiming/AimingState.ts b/apps/frontend/lib/babylon/state/7_aiming/AimingState.ts index 2ad93347..0957f0f4 100644 --- a/apps/frontend/lib/babylon/state/7_aiming/AimingState.ts +++ b/apps/frontend/lib/babylon/state/7_aiming/AimingState.ts @@ -30,6 +30,7 @@ function sendAimingDone(machine: StateMachine) { (machine.loaded.turn.chosenWeapon?.getProjectileSpawnPos()?.y ?? machine.loaded.turn.chosenWorm.collider.position.y); machine.msgToServer(CS_Type.CS_EndAimState, { + id: machine.loaded.turn.chosenWeapon?.weaponId ?? 0, wormAngle: data.wormAngle, position: { x: pos_x, diff --git a/apps/frontend/lib/babylon/state/8_turn_end/Projectile.ts b/apps/frontend/lib/babylon/state/8_turn_end/Projectile.ts new file mode 100644 index 00000000..700fe3c8 --- /dev/null +++ b/apps/frontend/lib/babylon/state/8_turn_end/Projectile.ts @@ -0,0 +1,53 @@ +import { Mesh, MeshBuilder, PhysicsAggregate, PhysicsMotionType, PhysicsShape, PhysicsShapeType, Scene, StateCondition, Vector3 } from "@babylonjs/core"; +import { StateMachine } from "../StateMachine"; +import { ThinSSRBlurCombinerPostProcess } from "@babylonjs/core/PostProcesses/thinSSRBlurCombinerPostProcess"; + +export class Projectile { + + private speed: number = 10000000; + + public type: number = 0; + public launchPos: Vector3 = Vector3.Zero(); + public launchAngle: number = 0; + public endPos: Vector3 = Vector3.Zero(); + + // public mesh: Mesh; + // public aggregate: PhysicsAggregate; + + constructor() {} + + launchProjectile(scene: Scene) + { + const mesh = MeshBuilder.CreateSphere + ( + "projectile", + { diameter: 0.5 }, + scene + ); + mesh.position = this.launchPos; + + const aggregate = new PhysicsAggregate + ( + mesh, + PhysicsShapeType.SPHERE, + { mass: 1, restitution: 0, friction: 50 }, + scene + ); + aggregate.body.setMotionType(PhysicsMotionType.DYNAMIC); + mesh.isVisible = true; + + console.log(`Received angle: ${this.launchAngle / Math.PI * 180}, turned into ${mesh.rotation.z / Math.PI * 180}`); + + // this.mesh.isVisible = true; + // this.aggregate.body.setCollisionCallbackEnabled(true); + + const direction2 = new Vector3(Math.sin(this.launchAngle), Math.cos(this.launchAngle), 0); + console.log("We go in", direction2); + aggregate.body.applyImpulse(direction2.scale(this.speed), mesh.getAbsolutePosition()); + + console.log("Launch position: ", this.launchPos); + console.log("Mesh position: ", mesh.position); + console.log("Launch angle: ", mesh.rotation.z); + console.log("Of course i did xd!"); + } +} \ No newline at end of file diff --git a/apps/frontend/lib/babylon/state/8_turn_end/TurnEndState.ts b/apps/frontend/lib/babylon/state/8_turn_end/TurnEndState.ts index 875443db..056eb62f 100644 --- a/apps/frontend/lib/babylon/state/8_turn_end/TurnEndState.ts +++ b/apps/frontend/lib/babylon/state/8_turn_end/TurnEndState.ts @@ -1,7 +1,7 @@ import { SC_TurnEnds, SC_Type } from '@/shared/packets/ServerClientPackets'; import { IState } from '../IState' import { StateMachine } from '../StateMachine'; -import { IAction, Vector3 } from '@babylonjs/core' +import { ActionManager, ExecuteCodeAction, IAction, MeshBuilder, PhysicsAggregate, PhysicsMotionType, PhysicsShapeType, Vector3 } from '@babylonjs/core' import { CS_ClientFinishedTurn, CS_Type } from '@/shared/packets/ClientServerPackets'; /** @@ -27,7 +27,13 @@ export class TurnEndState implements IState { // Setup turnMessage(this.machine); + // if (!this.machine.loaded) + // return; + + // const projectile = this.machine.loaded.turn.projectile; + // Actions + // projectile.launchProjectile(this.machine.scene); } tick() { diff --git a/apps/frontend/lib/babylon/state/9_game_end/GameEndState.ts b/apps/frontend/lib/babylon/state/9_game_end/GameEndState.ts index a9a643f6..d7a037c6 100644 --- a/apps/frontend/lib/babylon/state/9_game_end/GameEndState.ts +++ b/apps/frontend/lib/babylon/state/9_game_end/GameEndState.ts @@ -34,6 +34,16 @@ export class GameEndState implements IState { this.machine.msgToServer(CS_Type.CS_DEV_StartEndscreen, { won: false, winnerId: "", + payload: { + userId: this.machine.userId, + type: "marathon-mayem" , + name: "Marathon Mayem", + description: "Travel 20 meters total", + achieved: this.machine.achievements.achievements["marathon-mayem"], + progress: 10, + progressTarget: 50, + meta: { distance: 8 } + } }); } } diff --git a/apps/frontend/lib/babylon/state/StateMachine.ts b/apps/frontend/lib/babylon/state/StateMachine.ts index 107fe918..99d09fad 100644 --- a/apps/frontend/lib/babylon/state/StateMachine.ts +++ b/apps/frontend/lib/babylon/state/StateMachine.ts @@ -26,6 +26,7 @@ import { aimingMeshes } from './1_loading/loadGame'; import { Achievements } from '../data/achievments'; import { movementTick } from './6_movement/movementTick'; import { ExplosionParticles } from './8_turn_end/ExplosionParticles'; +import { useDeprecatedInvertedScale } from 'framer-motion'; // Stores the part of the statemachine that are created in the loading step export interface loaded { @@ -89,7 +90,7 @@ export class StateMachine { this.guiHelper = undefined; this.loaded = undefined; this.activePlayerId = ""; - this.achievements = new Achievements(); + this.achievements = new Achievements(this.userId); } // Called only once per canvas, when sockets have been set up @@ -154,7 +155,8 @@ export class StateMachine { // Set up a fresh Game this.log("Setting up new Game"); - this.guiHelper = new GuiHelper(this.scene, this.canvas, this.userId, this.msgToServer); + + this.guiHelper = new GuiHelper(this, this.scene, this.canvas, this.userId, this.msgToServer); // Need to prompt socket to update the UI if its connected this.queue?.updateSocketUi(); //this.msgToServer(CS_Type.CS_GetGameState, {}); diff --git a/apps/frontend/lib/packets/handlePacket.ts b/apps/frontend/lib/packets/handlePacket.ts index 1a5a3ad9..55f6a666 100644 --- a/apps/frontend/lib/packets/handlePacket.ts +++ b/apps/frontend/lib/packets/handlePacket.ts @@ -1,7 +1,7 @@ import { SC_Type, SC_GenericPacket, frontendServerPackets, SC_ExplosionOccurs } from "@/shared/packets/ServerClientPackets" import { StateMachine } from '../babylon/state/StateMachine'; import { GameState } from '@/shared/state/GameState'; -import { Nullable } from "@babylonjs/core"; +import { Nullable, Vector3 } from "@babylonjs/core"; import { Control, TextBlock } from "@babylonjs/gui"; import { Player } from "../babylon/player/Player"; import { Worm } from '../babylon/player/Worm'; diff --git a/apps/frontend/package-lock.json b/apps/frontend/package-lock.json index d1d8dcf8..886a76a2 100644 --- a/apps/frontend/package-lock.json +++ b/apps/frontend/package-lock.json @@ -12,6 +12,7 @@ "@babylonjs/gui": "^8.56.2", "@babylonjs/loaders": "^8.54.3", "@types/react-avatar-editor": "^13.0.4", + "axios": "^1.17.0", "earcut": "^3.0.2", "framer-motion": "^12.38.0", "lucide-react": "^1.16.0", @@ -3107,6 +3108,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", @@ -3355,6 +3368,12 @@ "node": ">= 0.4" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -3381,6 +3400,18 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.17.0.tgz", + "integrity": "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -3508,7 +3539,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3618,6 +3648,18 @@ "dev": true, "license": "MIT" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3816,6 +3858,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -3861,7 +3912,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -4014,7 +4064,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4024,7 +4073,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4069,7 +4117,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -4082,7 +4129,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4709,6 +4755,26 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -4725,6 +4791,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/framer-motion": { "version": "12.40.0", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.40.0.tgz", @@ -4771,7 +4853,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4832,7 +4913,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -4857,7 +4937,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -4952,7 +5031,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5024,7 +5102,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5037,7 +5114,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -5053,7 +5129,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -5092,6 +5167,19 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -6146,7 +6234,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6183,6 +6270,27 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -6822,6 +6930,15 @@ "dev": true, "license": "MIT" }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 1ed86a23..fb880a12 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -15,6 +15,7 @@ "@babylonjs/gui": "^8.56.2", "@babylonjs/loaders": "^8.54.3", "@types/react-avatar-editor": "^13.0.4", + "axios": "^1.17.0", "earcut": "^3.0.2", "framer-motion": "^12.38.0", "lucide-react": "^1.16.0", diff --git a/apps/game/package-lock.json b/apps/game/package-lock.json index 0d5c24aa..c0f022eb 100644 --- a/apps/game/package-lock.json +++ b/apps/game/package-lock.json @@ -13,6 +13,7 @@ "@nestjs/core": "^11.0.1", "@nestjs/platform-express": "^11.0.1", "@nestjs/platform-socket.io": "^11.1.16", + "axios": "^1.17.0", "babylonjs": "^8.55.3", "earcut": "^3.0.2", "reflect-metadata": "^0.2.2", @@ -5751,6 +5752,18 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", @@ -5947,9 +5960,20 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, "license": "MIT" }, + "node_modules/axios": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.17.0.tgz", + "integrity": "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, "node_modules/babel-jest": { "version": "30.3.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.3.0.tgz", @@ -6572,7 +6596,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -6848,7 +6871,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" @@ -7131,7 +7153,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -7690,6 +7711,26 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -7739,7 +7780,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -7756,7 +7796,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -7766,7 +7805,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -8111,7 +8149,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -8162,6 +8199,19 @@ "url": "https://opencollective.com/express" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -10376,6 +10426,15 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", diff --git a/apps/game/package.json b/apps/game/package.json index 2e4b60c4..72ee4761 100644 --- a/apps/game/package.json +++ b/apps/game/package.json @@ -25,6 +25,7 @@ "@nestjs/core": "^11.0.1", "@nestjs/platform-express": "^11.0.1", "@nestjs/platform-socket.io": "^11.1.16", + "axios": "^1.17.0", "babylonjs": "^8.55.3", "earcut": "^3.0.2", "reflect-metadata": "^0.2.2", diff --git a/apps/game/src/game/Game.ts b/apps/game/src/game/Game.ts index 83c0a07f..0ae54aa1 100644 --- a/apps/game/src/game/Game.ts +++ b/apps/game/src/game/Game.ts @@ -17,6 +17,7 @@ import { explosionData, pointData } from '@/shared/packets/util'; import { Player } from './gamestate/Player'; interface aimingData { + id: number; wormAngle: number; position: pointData; targetAngle: number; @@ -74,6 +75,7 @@ export class Game { this.currentState.enter(); this.turnOrder = []; this.aimingData = { + id: 0, position: { x: 0, y: 0, diff --git a/apps/game/src/lobbies/lobbyUtil/packets/handleGamePackets.ts b/apps/game/src/lobbies/lobbyUtil/packets/handleGamePackets.ts index 3a69e242..514e072f 100644 --- a/apps/game/src/lobbies/lobbyUtil/packets/handleGamePackets.ts +++ b/apps/game/src/lobbies/lobbyUtil/packets/handleGamePackets.ts @@ -14,10 +14,12 @@ import { SC_SwitchAimState, SC_AimTargetAngle, SC_CancelAiming, + SC_EndAimState, SC_WormPosition, SC_WinningPlayer, } from '@/shared/packets/ServerClientPackets'; import { GameState } from '@/shared/state/GameState'; +import { createAchievement, updateAchievement } from '@/shared/packets/stats-client'; import { explosionData } from '@/shared/packets/util'; function requestChangeState( @@ -69,9 +71,11 @@ export function handleGamePackets(lobby: Lobby, data: CS_GenericPacket) { break; } + // DEV mode, should be removed late, Client commands state to be set to Lobby after game ends case CS_Type.CS_DEV_StartEndscreen: { lobby.setState(LobbyStateEnum.EndScreen); + updateAchievement(data.payload); break; } @@ -136,11 +140,15 @@ export function handleGamePackets(lobby: Lobby, data: CS_GenericPacket) { // Do not allow non-active user to submit data if (lobby.clientManager.getActive().id != data.userId) return; const target = lobby.game.aimingData; + target.id = data.id; target.wormAngle = data.wormAngle; target.position = data.position; target.targetAngle = data.targetAngle; target.force = data.force; target.explosions = data.explosions; + lobby.msgToClient(SC_Type.SC_EndAimState, { + ...target + }); requestChangeState(lobby, data.userId, GameState.TURN_END); break; } diff --git a/apps/stats/src/modules/persistence/repository/achievement.repository.ts b/apps/stats/src/modules/persistence/repository/achievement.repository.ts index 0d4b7264..e4117910 100644 --- a/apps/stats/src/modules/persistence/repository/achievement.repository.ts +++ b/apps/stats/src/modules/persistence/repository/achievement.repository.ts @@ -77,6 +77,7 @@ export class AchievementRepository { userId_type: { userId: dto.userId, type: dto.type, + }, }, update: { diff --git a/package-lock.json b/package-lock.json index 610c8e4d..def3e5a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,343 @@ { - "name": "trancendency", + "name": "transendence", "lockfileVersion": 3, "requires": true, - "packages": {} + "packages": { + "": { + "dependencies": { + "axios": "^1.17.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.17.0.tgz", + "integrity": "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + } + } } diff --git a/package.json b/package.json new file mode 100644 index 00000000..05b47b1e --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "axios": "^1.17.0" + } +} diff --git a/shared/game/packets/ClientServerPackets.ts b/shared/game/packets/ClientServerPackets.ts index 168b7a8e..d9e92702 100644 --- a/shared/game/packets/ClientServerPackets.ts +++ b/shared/game/packets/ClientServerPackets.ts @@ -1,6 +1,7 @@ // import * from 'ClientServerPackets.ts'; import { aimStateId, explosionData, pointData } from "./util"; +import { CreateAchievementPayload } from "./stats-client" /** @@ -264,6 +265,7 @@ export interface CS_WormPosition extends CS_Base { } export interface CS_EndAimState extends CS_Base { + id: number, type: CS_Type.CS_EndAimState, wormAngle: number, position: pointData @@ -290,10 +292,13 @@ export interface CS_IWIN extends CS_Base { /** * DEV MODE, delete later */ + + export interface CS_DEV_StartEndscreen extends CS_Base { type: CS_Type.CS_DEV_StartEndscreen, won: boolean, winnerId: string, + payload: CreateAchievementPayload, } export type CS_GenericPacket = diff --git a/shared/game/packets/ServerClientPackets.ts b/shared/game/packets/ServerClientPackets.ts index d73bf690..70d6620a 100644 --- a/shared/game/packets/ServerClientPackets.ts +++ b/shared/game/packets/ServerClientPackets.ts @@ -47,6 +47,7 @@ export enum SC_Type { SC_DEV_KillRandomWorm = "SC_DEV_KillRandomWorm", SC_WinningPlayer = "SC_WinningPlayer", SC_LobbySettingsUpdate = "SC_LobbySettingsUpdate", + SC_EndAimState = "SC_EndAimState", } // Packets that should definitely not show up in logging @@ -363,6 +364,16 @@ export interface SC_TurnEnds extends SC_Base { data: endOfTurnData, } +// bia bla blub +export interface SC_EndAimState extends SC_Base { + id: number; + type: SC_Type.SC_EndAimState, + wormAngle: number, + position: pointData + targetAngle: number, + force: number, +} + /** * Sent when game is started or loaded so Clients can display game * @param data Data that is needed for game to be loaded @@ -412,7 +423,7 @@ export type SC_GenericPacket = SC_GameData | SC_ActivePlayerChanged | SC_WormChosen | SC_ExplosionOccurs | SC_WeaponChosen | SC_AimAngle | SC_AimMoveTarget | SC_SwitchAimState | SC_AimTargetAngle | - SC_CancelAiming | SC_LobbySettingsUpdate | + SC_CancelAiming | SC_EndAimState | SC_LobbySettingsUpdate | SC_TurnEnds | SC_WormPosition | SC_DEV_KillRandomWorm | SC_WinningPlayer ; diff --git a/shared/game/packets/stats-client.ts b/shared/game/packets/stats-client.ts new file mode 100644 index 00000000..57156e53 --- /dev/null +++ b/shared/game/packets/stats-client.ts @@ -0,0 +1,33 @@ +import axios from "axios"; + +export interface CreateAchievementPayload { + userId: string; + type: string; + name: string; + description?: string; + icon?: string; + xpReward?: number; + points?: number; + progress?: number; + progressTarget?: number; + achieved: boolean; + meta?: Record; +} + +export async function createAchievement(payload: CreateAchievementPayload) { + const url = "http://stats_service:3000/internal/stats/achievements"; + + await axios.post(url, payload, { + headers: { "x-service-name": "game_service" }, + timeout: 2000, + }); +} + +export async function updateAchievement(payload: CreateAchievementPayload) { + const url = "http://stats_service:3000/internal/stats/achievements/upsert"; + + await axios.post(url, payload, { + headers: { "x-service-name": "game_service" }, + timeout: 2000, + }); +} \ No newline at end of file