184 lines
8.4 KiB
JavaScript
184 lines
8.4 KiB
JavaScript
const EntityNewPacket = require("../Packets/EntityNew");
|
|
const EntityDiePacket = require("../Packets/EntityDie");
|
|
const GuildIslandCapturedPacket = require("../Packets/GuildIslandCaptured");
|
|
const AttackInformationPacket = require("../Packets/AttackInformation");
|
|
const AttackerInformationPacket = require("../Packets/AttackerInformation");
|
|
const AttackingPacket = require("../Packets/Attacking");
|
|
const HealthChangedPacket = require("../Packets/HealthChanged");
|
|
const HealthChangedAuthorlessPacket = require("../Packets/HealthChangedAuthorless");
|
|
const GuildDataIslandTowerDestroyedPacket = require("../Packets/GuildDataIslandTowerDestroyed");
|
|
const GuildDataIslandTowerHealthChangedPacket = require("../Packets/GuildDataIslandTowerHealthChanged");
|
|
const GuildDataIslandCapturedPacket = require("../Packets/GuildDataIslandCaptured");
|
|
const GuildDataIslandTowerBuiltPacket = require("../Packets/GuildDataIslandTowerBuilt");
|
|
const WorldMapGuildEntryPacket = require("../Packets/WorldMapGuildEntry");
|
|
const GuildDataIslandPacket = require("../Packets/GuildDataIsland");
|
|
const GuildDataIslandTowerPacket = require("../Packets/GuildDataIslandTower");
|
|
|
|
const schemeTower = require("../Data/schemeTower");
|
|
const queries = require("../Data/queries");
|
|
const { QUERY_FETCH_GUILD_TOWERS, QUERY_UPDATE_GUILD_ISLAND_TOWER_DEAD, QUERY_UPDATE_GUILD_ISLAND_TOWER_UPGRADE, QUERY_UPDATE_GUILD_ISLAND_TOWER_DEFAULT, QUERY_DELETE_GUILD_ISLAND_DAMAGES, QUERY_UPDATE_GUILD_ISLAND_AUTHOR, QUERY_UPDATE_GUILD_ISLAND_DAMAGES } = queries;
|
|
|
|
const constants = require("../Data/constants");
|
|
const { EVENTS } = constants;
|
|
const { EVENT_ATTACK_STARTED, EVENT_HEALTH_CHANGED_AUTHORLESS, EVENT_ATTACKING, EVENT_ATTACK_BAR, EVENT_DIE, EVENT_GUILD_ISLAND_CAPTURE, EVENT_GUILD_ISLAND_TOWER_BUILT, EVENT_GUILD_ISLAND_TOWER_HEALTH_CHANGED } = EVENTS;
|
|
|
|
const Tower = require("../Game/Tower");
|
|
const Game = require("../Game/Game");
|
|
const { guildIslands } = Game;
|
|
|
|
module.exports = async function (map, globalDieCallback, globalRewardCallback, globalAttackCallback) {
|
|
const towers = await execute(QUERY_FETCH_GUILD_TOWERS, [map.id]);
|
|
if (towers.error) return process.exit();
|
|
|
|
const allTowersMap = towers.data;
|
|
if (!allTowersMap) return;
|
|
|
|
let order = 0;
|
|
let previousIslandID = 0;
|
|
|
|
for (let i = 0, length = allTowersMap.length; i < length; i++) {
|
|
const tower = allTowersMap[i];
|
|
const scheme = schemeTower[tower.entityTypeID];
|
|
if (!scheme) continue;
|
|
|
|
const island = guildIslands.find(island => island.id === tower.guildIslandID);
|
|
|
|
if (previousIslandID !== island.id) order = 0;
|
|
previousIslandID = island.id;
|
|
|
|
const towerInstance = new Tower({
|
|
id: tower.id,
|
|
order: ++order,
|
|
entityTypeID: tower.entityTypeID,
|
|
island,
|
|
map,
|
|
maximumHitpoint: scheme.maximumHitpoints,
|
|
currentHitpoint: tower.currentHitpoints,
|
|
position: {
|
|
x: tower.positionX,
|
|
y: tower.positionY
|
|
},
|
|
attackCallback: globalAttackCallback,
|
|
dieCallback: globalDieCallback
|
|
});
|
|
|
|
const packet = EntityNewPacket.tower(towerInstance.getProperties());
|
|
map.registerNetworkPacket(towerInstance.id, packet);
|
|
|
|
towerInstance.on(EVENT_DIE, function (data, id) {
|
|
const packet = EntityDiePacket(data[0]);
|
|
this.map.registerNetworkPacket(id, [packet], [1]);
|
|
|
|
const packet_2 = GuildDataIslandTowerDestroyedPacket(data[1]);
|
|
const topic = Game.getTopic(this.island.guild.topic);
|
|
topic.push(packet_2);
|
|
|
|
execute(QUERY_UPDATE_GUILD_ISLAND_TOWER_DEAD, [0, Tower.getID(this.id)]);
|
|
});
|
|
|
|
towerInstance.on(EVENT_ATTACK_STARTED, function (data, author) {
|
|
const packet = AttackInformationPacket(data);
|
|
this.map.registerIndividualNetworkPacket(author, packet);
|
|
});
|
|
|
|
towerInstance.on(EVENT_HEALTH_CHANGED_AUTHORLESS, function (data, author) {
|
|
const packet = HealthChangedAuthorlessPacket(data);
|
|
this.map.registerNetworkPacket(this.id, packet, [1]);
|
|
});
|
|
|
|
towerInstance.on(EVENT_ATTACK_BAR, function (data, author) {
|
|
const packet = AttackerInformationPacket(data);
|
|
this.map.registerIndividualNetworkPacket(author, packet);
|
|
});
|
|
|
|
towerInstance.on(EVENT_ATTACKING, function (data, author) {
|
|
const packet = AttackingPacket(data[1]);
|
|
const packet_2 = HealthChangedPacket(data[0]);
|
|
this.map.registerNetworkPacket(author, [packet, packet_2], [1, 1]);
|
|
});
|
|
|
|
towerInstance.on("_", function (data) {
|
|
execute(QUERY_UPDATE_GUILD_ISLAND_DAMAGES, [data.damage, data.guildIslandID, data.guildID, data.damage]);
|
|
});
|
|
|
|
towerInstance.on(EVENT_GUILD_ISLAND_TOWER_HEALTH_CHANGED, function (data, author) {
|
|
const topic = Game.getTopic(this.island.guild.topic);
|
|
const packet = GuildDataIslandTowerHealthChangedPacket(data);
|
|
topic.push(packet);
|
|
});
|
|
|
|
towerInstance.on(EVENT_GUILD_ISLAND_TOWER_BUILT, async function (data, author) {
|
|
await execute(QUERY_UPDATE_GUILD_ISLAND_TOWER_UPGRADE, [this.entityTypeID, this.hp.maximum, Tower.getID(this.id)]);
|
|
|
|
const topic = Game.getTopic(this.island.guild.topic);
|
|
const packet = GuildDataIslandTowerBuiltPacket(data);
|
|
topic.push(packet);
|
|
});
|
|
|
|
towerInstance.on(EVENT_GUILD_ISLAND_CAPTURE, async function (data, author) {
|
|
const packet = GuildIslandCapturedPacket(data.packet);
|
|
app.publish(this.map.id.toString(), packet, true, true);
|
|
|
|
if (data.database.oldID !== data.database.newID) {
|
|
const packet_2 = GuildDataIslandCapturedPacket({
|
|
guildIslandID: this.island.id
|
|
});
|
|
|
|
const topicOld = Game.getTopic(data.topicOld);
|
|
topicOld.push(packet_2);
|
|
|
|
const islandProperties = {
|
|
id: this.island.id,
|
|
mapID: this.map.id,
|
|
position: this.island.position,
|
|
};
|
|
|
|
const guildDataIslandPacket = GuildDataIslandPacket(islandProperties);
|
|
|
|
const topicNew = Game.getTopic(data.topicNew);
|
|
topicNew.push(guildDataIslandPacket);
|
|
|
|
this.island.towers.forEach(tower => {
|
|
const towerProperties = {
|
|
entityTypeID: tower.entityTypeID,
|
|
id: tower.id,
|
|
guildIslandID: island.id,
|
|
order: tower.order,
|
|
hp: {
|
|
current: tower.hp.current
|
|
},
|
|
isRepairing: tower.isRepairing()
|
|
};
|
|
|
|
const guildDataIslandTowerPacket = GuildDataIslandTowerPacket(towerProperties);
|
|
topicNew.push(guildDataIslandTowerPacket);
|
|
});
|
|
};
|
|
|
|
const packet_3 = WorldMapGuildEntryPacket({
|
|
locationMapID: this.map.id,
|
|
index: this.island.index,
|
|
bufferTag: this.island.guild.tag
|
|
});
|
|
|
|
Game.maps.forEach(map => app.publish(map.id.toString(), packet_3, true, true));
|
|
|
|
let dbConnection = null;
|
|
|
|
try {
|
|
dbConnection = await db.getConnection();
|
|
await dbConnection.beginTransaction();
|
|
|
|
await execute(QUERY_UPDATE_GUILD_ISLAND_TOWER_DEFAULT, [5000, this.island.id]);
|
|
await execute(QUERY_DELETE_GUILD_ISLAND_DAMAGES, [this.island.id]);
|
|
await execute(QUERY_UPDATE_GUILD_ISLAND_AUTHOR, [data.database.newID, this.island.id]);
|
|
|
|
await dbConnection.commit();
|
|
} catch {
|
|
await dbConnection.rollback();
|
|
} finally {
|
|
dbConnection.release();
|
|
};
|
|
});
|
|
};
|
|
}; |