1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-03-17 20:58:13 +02:00
This commit is contained in:
MewMew 2019-10-22 05:28:45 +02:00
parent cde475739a
commit 3a0097ed45

View File

@ -178,7 +178,14 @@ local function init_player_table(player)
if not player then return end
if not global.score[player.force.name] then global.score[player.force.name] = {} end
if not global.score[player.force.name].players then global.score[player.force.name].players = {} end
if not global.score[player.force.name].players[player.name] then global.score[player.force.name].players[player.name] = {} end
if not global.score[player.force.name].players[player.name] then
global.score[player.force.name].players[player.name] = {
built_entities = 0,
deaths = 0,
killscore = 0,
mined_entities = 0,
}
end
end
local function on_player_joined_game(event)
@ -239,123 +246,89 @@ local function on_rocket_launched(event)
if not global.score[force_name]
then global.score[force_name] = {}
end
local force_score = global.score[force_name]
force_score.rocket_launches = 1 + (force_score.rocket_launches or 0)
--game.print ("A rocket has been launched!", {r=0.98, g=0.66, b=0.22})
refresh_score_full()
end
local score_table = {
["small-biter"] = 5,
["medium-biter"] = 15,
["big-biter"] = 30,
local entity_score_values = {
["behemoth-biter"] = 100,
["small-spitter"] = 5,
["medium-spitter"] = 15,
["big-spitter"] = 30,
["behemoth-spitter"] = 100,
["biter-spawner"] = 200,
["spitter-spawner"] = 200,
["small-worm-turret"] = 50,
["medium-worm-turret"] = 150,
["behemoth-worm-turret"] = 300,
["big-biter"] = 30,
["big-spitter"] = 30,
["big-worm-turret"] = 300,
["player"] = 1000
["biter-spawner"] = 200,
["medium-biter"] = 15,
["medium-spitter"] = 15,
["medium-worm-turret"] = 150,
["character"] = 1000,
["small-biter"] = 5,
["small-spitter"] = 5,
["small-worm-turret"] = 50,
["spitter-spawner"] = 200,
["gun-turret"] = 50,
["laser-turret"] = 150,
["flamethrower-turret"] = 300,
}
local function train_type_cause(event)
local players = {}
if event.cause.train.passengers then
for _, player in pairs(event.cause.train.passengers) do
players[#players + 1] = player
end
end
return players
end
local kill_causes = {
["character"] =
function(event)
if not event.cause.player then return end
return {event.cause.player}
end,
["car"] =
function(event)
local players = {}
local driver = event.cause.get_driver()
if driver then
if driver.player then players[#players + 1] = driver.player end
end
local passenger = event.cause.get_passenger()
if passenger then
if passenger.player then players[#players + 1] = passenger.player end
end
return players
end,
["locomotive"] = train_type_cause,
["cargo-wagon"] = train_type_cause,
["artillery-wagon"] = train_type_cause,
["fluid-wagon"] = train_type_cause,
}
local function on_entity_died(event)
local player = false
local passenger = false
local train_passengers = false
local proximity_list = {}
-- Handles worm kills with no cause
if event.entity.type == "turret" then
local radius = 24
local position = event.entity.position
local insert = table.insert
--Since we cannot reliably get the player who killed the worm, get all players in a radius and award them xp
for _, p in pairs(game.connected_players) do
if p.position.x < position.x + radius and p.position.x > position.x - radius and p.position.y < position.y + radius and p.position.y > position.y - radius then
insert(proximity_list, {player = p})
end
if not event.entity.valid then return end
if not event.cause then return end
if not event.cause.valid then return end
if event.entity.force.index == event.cause.force.index then return end
if not entity_score_values[event.entity.name] then return end
if not kill_causes[event.cause.type] then return end
local players_to_reward = kill_causes[event.cause.type](event)
if not players_to_reward then return end
if #players_to_reward == 0 then return end
if not global.score[event.force.name] then global.score[event.force.name] = {} end
if not global.score[event.force.name].players then global.score[event.force.name].players = {} end
for _, player in pairs(players_to_reward) do
init_player_table(player)
local score = global.score[event.force.name].players[player.name]
score.killscore = score.killscore + entity_score_values[event.entity.name]
if global.show_floating_killscore[player.name] then
event.entity.surface.create_entity({name = "flying-text", position = event.entity.position, text = tostring(entity_score_values[event.entity.name]), color = player.chat_color})
end
end
-- Unit/Spawner Kills
if event.entity.type == "unit" or event.entity.type == "unit-spawner" then
if event.cause then
if event.cause.name == "character" then player = event.cause.player end
--Check for passengers
if event.cause.type == "car" then
player = event.cause.get_driver()
passenger = event.cause.get_passenger()
if player then player = player.player end
if passenger then passenger = passenger.player end
end
if event.cause.type == "locomotive" then
player = event.cause.get_driver()
train_passengers = event.cause.train.passengers
end
if not train_passengers and not passenger and not player then return end
if event.cause.force.name == event.entity.force.name then return end
init_player_table(player)
if not global.score[event.force.name] then global.score[event.force.name] = {} end
if not global.score[event.force.name].players then global.score[event.force.name].players = {} end
if not global.score[event.force.name].players then global.score[event.force.name].players[player.name] = {} end
end
end
if score_table[event.entity.name] then
local show_floating_text = false
local color = {r=0.98, g=0.66, b=0.22}
-- Color based on main player color
if #proximity_list <= 0 and player then
color = player.color
color.r = color.r * 0.6 + 0.4
color.g = color.g * 0.6 + 0.4
color.b = color.b * 0.6 + 0.4
end
local rewarded_players = {}
if player then
table.insert(rewarded_players, player)
end
for _,p in pairs(proximity_list) do
table.insert(rewarded_players, p.player)
end
if passenger then
table.insert(rewarded_players, passenger)
end
if train_passengers then
for _,p in pairs(train_passengers) do
table.insert(rewarded_players, p)
end
end
-- Add killscore
local points = score_table[event.entity.name]
for _, p in pairs(rewarded_players) do
-- Handles floating text
if global.show_floating_killscore[p.name] == true then
show_floating_text = true
end
-- Add
local score = global.score[event.force.name].players[p.name]
if score then
score.killscore = points + (score.killscore or 0)
end
end
if show_floating_text == true then
event.entity.surface.create_entity({name = "flying-text", position = event.entity.position, text = tostring(points), color = color})
end
end
end
end
local function on_player_died(event)
local player = game.players[event.player_index]