ztavern/node-server-manager/Lib/EventDispatcher.js
2024-10-18 00:19:19 +00:00

118 lines
No EOL
5.5 KiB
JavaScript

const { randomInt } = require('crypto')
const ePlayer = require('./Entity/Player.js')
const wait = require('delay')
class EventDispatcher {
constructor(Server, Manager) {
this.Server = Server
this.Manager = Manager
}
async dispatchCallback(event) {
if (!event) return
try {
this.Server.emit('event', event)
this.Server.uptime = event.data.TimeOffset
if (this.Server.previousUptime > this.Server.uptime) {
this.Server.previousUptime = this.Server.uptime
this.Server.loadClientsAsync()
this.Server.emit('reload')
return
}
switch (event.type) {
case 'init':
this.Server.emit('init')
break
case 'say':
if (!event.data.Origin.Clientslot || !this.Server.Clients[event.data.Origin.Clientslot]) return
var Player = this.Server.Clients[event.data.Origin.Clientslot]
Player.emit('message', event.data.Message)
this.Server.emit('message', Player, event.data.Message)
this.Server.emit('any_event', {type: 'say', Origin: this.Server.Clients[event.data.Origin.Clientslot], Data: event.data.Message})
break
case 'join':
if (this.Server.Clients[event.data.Origin.Clientslot] != null
&& this.Server.Clients[event.data.Origin.Clientslot].Guid == event.data.Origin.Guid) {
this.Server.Clients[event.data.Origin.Clientslot].matchData = {}
this.Server.emit('preconnect', this.Server.Clients[event.data.Origin.Clientslot])
this.Server.emit('any_event', {type: 'join', Origin: this.Server.Clients[event.data.Origin.Clientslot]})
return
}
for (var i = 0; i < this.Server.Clients.length; i++) {
if (!this.Server.Clients[i]) continue
if (this.Server.Clients[i].Guid == event.data.Origin.Guid && this.Server.Clients[i].Clientslot != event.data.Origin.Clientslot) {
this.Server.Clients[i].removeAllListeners()
this.Server.Clients[i] = null
}
}
await wait(100)
try {
var IPAddress = (await this.Server.Rcon.getClientByGuid(event.data.Origin.Guid)).address
}
catch (e) {}
if (!IPAddress)
IPAddress = `${randomInt(999)}.${randomInt(999)}.${randomInt(999)}.${randomInt(999)}`
var Player = new ePlayer(event.data.Origin.Guid, event.data.Origin.Name, event.data.Origin.Clientslot, IPAddress, this.Server)
await Player.build()
this.Server.emit('connect', Player)
this.Server.emit('any_event', {type: 'join', Origin: Player})
break
case 'quit':
this.Server.emit('event', {type: 'quit', Origin: this.Server.Clients[event.data.Origin.Clientslot]})
if (!event.data.Origin.Clientslot || !this.Server.Clients[event.data.Origin.Clientslot]) return
for (var i = 0; i < this.Server.Clients.length; i++) {
if (!this.Server.Clients[i]) continue
if (this.Server.Clients[i].Guid == event.data.Origin.Guid && this.Server.Clients[i].Clientslot != event.data.Origin.Clientslot) {
this.Server.Clients[i].removeAllListeners()
this.Server.Clients[i] = null
}
}
this.Server.emit('disconnect', Object.assign({}, this.Server.Clients[event.data.Origin.Clientslot]))
this.Server.Clients[event.data.Origin.Clientslot].removeAllListeners()
this.Server.Clients[event.data.Origin.Clientslot] = null
break
case 'kill':
var Target = this.Server.Clients[event.data.Target.Clientslot]
var Attacker = (event.data.Origin.Clientslot && event.data.Origin.Clientslot >= 0) ? this.Server.Clients[event.data.Origin.Clientslot] : Target
if (Attacker.Clientslot != Target.Clientslot) {
Attacker.emit('kill', Target, event.data.Attack)
Target.emit('death', Attacker, event.data.Attack)
this.Server.emit('death', Target, Attacker, event.data.Attack)
this.Server.emit('kill', Target, Attacker, event.data.Attack)
this.Server.emit('any_event', {type: 'death', Origin: Target, Attack: event.data.Attack })
this.Server.emit('any_event', { type:'kill', Origin: Attacker, Attack: event.data.Attack })
return
}
Attacker.emit('death', Attacker, event.data.Attack)
this.Server.emit('death', Attacker, Attacker, event.data.Attack)
break
}
this.Server.previousUptime = event.data.TimeOffset
}
catch (e) {
this.Manager.logger.writeLn(`Error occurred while dispatching event`)
}
}
}
module.exports = EventDispatcher