Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --mod-projectile--
- --creates smoke and can modify various properties of any projectile.
- --author Grimlocke
- --(heavily) based on scripts by zaporozhets
- --who on turn based his work on scripts by expwnent and Putnam
- local eventful = require 'plugins.eventful'
- ammoProperties = {
- [ "ITEM_AMMO_GUN_20MM_BALL" ] = { deviation = 5, hitrateMod = 5, velocityMult = 1, rateMult = 0.35, breakChance = 100, piercing = false, shotCount = 1, shotItem = "NOPE" },
- [ "ITEM_AMMO_GUN_20MM_SHOT" ] = { deviation = 10, hitrateMod = 10, velocityMult = 0.6, rateMult = 0.35, breakChance = 100, piercing = false, shotCount = 4, shotItem = "AMMO:ITEM_AMMO_GUN_SHOT" },
- [ "ITEM_AMMO_GUN_35MM_BALL" ] = { deviation = 10, hitrateMod = 10, velocityMult = 1.2, rateMult = 0.40, breakChance = 100, piercing = false, shotCount = 1, shotItem = "NOPE" },
- [ "ITEM_AMMO_GUN_35MM_SHOT" ] = { deviation = 15, hitrateMod = 15, velocityMult = 0.6, rateMult = 0.40, breakChance = 100, piercing = false, shotCount = 8, shotItem = "AMMO:ITEM_AMMO_GUN_SHOT" },
- [ "ITEM_AMMO_THROW_DART" ] = { deviation = 2, hitrateMod = 2, velocityMult = 1, rateMult = 1.2, breakChance = 20, piercing = false, shotCount = 1, shotItem = "NOPE" },
- [ "ITEM_AMMO_THROW_JAVELIN" ] = { deviation = 2, hitrateMod = 2, velocityMult = 1, rateMult = 1.2, breakChance = 20, piercing = false, shotCount = 1, shotItem = "NOPE" },
- [ "ITEM_AMMO_BOLTS" ] = { deviation = 0, hitrateMod = 0, velocityMult = 1, rateMult = 0.7, breakChance = 60, piercing = false, shotCount = 1, shotItem = "NOPE" },
- [ "ITEM_AMMO_BOLTS_BROADHEAD" ] = { deviation = 0, hitrateMod = 0, velocityMult = 1, rateMult = 0.7, breakChance = 60, piercing = false, shotCount = 1, shotItem = "NOPE" },
- [ "ITEM_AMMO_ARROWS" ] = { deviation = 2, hitrateMod = 2, velocityMult = 1, rateMult = 1, breakChance = 75, piercing = false, shotCount = 1, shotItem = "NOPE" },
- [ "ITEM_AMMO_ARROWS_BARBED" ] = { deviation = 2, hitrateMod = 2, velocityMult = 1, rateMult = 1, breakChance = 75, piercing = false, shotCount = 1, shotItem = "NOPE" },
- [ "ITEM_AMMO_ARROWS_SWALLOWTAIL" ] = { deviation = 2, hitrateMod = 2, velocityMult = 1, rateMult = 1, breakChance = 75, piercing = false, shotCount = 1, shotItem = "NOPE" },
- [ "ITEM_AMMO_ARROWS_FORKHEAD" ] = { deviation = 2, hitrateMod = 2, velocityMult = 1, rateMult = 1, breakChance = 75, piercing = false, shotCount = 1, shotItem = "NOPE" }
- }
- eventful.onProjItemCheckMovement.blam = function(projectile)
- if projectile.distance_flown == 0 and projectile.firer ~= nil then
- ammoProperty = ammoProperties[dfhack.items.getSubtypeDef(projectile.item:getType(),projectile.item:getSubtype()).id]
- if ammoProperty ~= nil then
- projectileMod(projectile, ammoProperty)
- multiShot(projectile, ammoProperty)
- end
- elseif projectile.distance_flown == 1 then
- bulletSmoke(projectile, 5)
- elseif projectile.distance_flown == 2 then
- bulletSmoke(projectile, 10)
- elseif projectile.distance_flown == 3 then
- bulletSmoke(projectile, 25)
- elseif projectile.distance_flown == 5 then
- bulletSmoke(projectile, 35)
- end
- end
- function bulletSmoke(projectile, amount)
- if string.match(dfhack.items.getSubtypeDef(projectile.item:getType(),projectile.item:getSubtype()).id, "ITEM_AMMO_GUN") and projectile.firer ~= nil and projectile.distance_flown <= 3 then
- dfhack.maps.spawnFlow(projectile.cur_pos, 5, -1, -1, amount)
- elseif string.match(dfhack.items.getSubtypeDef(projectile.item:getType(),projectile.item:getSubtype()).id, "ITEM_AMMO_CANNON") and projectile.firer ~= nil then
- dfhack.maps.spawnFlow(projectile.cur_pos, 5, -1, -1, 1.25 * amount)
- end
- end
- function projectileMod(projectile, ammoProperty)
- projectile.target_pos.x = projectile.target_pos.x + math.random(-ammoProperty.deviation, ammoProperty.deviation)
- projectile.target_pos.y = projectile.target_pos.y + math.random(-ammoProperty.deviation, ammoProperty.deviation)
- projectile.unk22 = math.floor(projectile.unk22 * ammoProperty.velocityMult)
- projectile.firer.counters.think_counter = math.floor(projectile.firer.counters.think_counter / ammoProperty.rateMult)
- projectile.hit_rating = projectile.hit_rating + ammoProperty.hitrateMod
- projectile.flags.no_impact_destroy = math.floor((100 - ammoProperty.breakChance) / math.random(0, 100))
- projectile.flags.piercing = ammoProperty.piercing
- if ammoProperty.shotItem ~= "NOPE" then
- print(ammoProperty.shotItem)
- -- projectile.item:setType(dfhack.items.findType(shotItem)) doesn't work, no table launcher for now :(
- projectile.item:setSubtype(dfhack.items.findSubtype(ammoProperty.shotItem))
- end
- print(projectile.bow_id, projectile.item, projectile.unk22, projectile.hit_rating, dfhack.items.getSubtypeDef(projectile.item:getType(),projectile.item:getSubtype()).id)
- end
- function multiShot(projectile, ammoProperty)
- for i = 0, ammoProperty.shotCount - 2, 1 do
- local shot = projectile.item
- local multi = df.item.find(dfhack.items.createItem(shot:getType(), shot:getSubtype(), shot.mat_type, shot.mat_index, projectile.firer))
- multi.flags.forbid = true
- local multiProjectile = dfhack.items.makeProjectile(multi)
- multiProjectile.origin_pos.x = projectile.origin_pos.x -- + math.random(-1, 1)
- multiProjectile.origin_pos.y = projectile.origin_pos.y -- + math.random(-1, 1)
- multiProjectile.origin_pos.z = projectile.origin_pos.z
- multiProjectile.prev_pos.x = projectile.origin_pos.x
- multiProjectile.prev_pos.y = projectile.origin_pos.y
- multiProjectile.prev_pos.z = projectile.origin_pos.z
- multiProjectile.cur_pos.x = projectile.origin_pos.x
- multiProjectile.cur_pos.y = projectile.origin_pos.y
- multiProjectile.cur_pos.z = projectile.origin_pos.z
- multiProjectile.target_pos.x = projectile.target_pos.x + math.random(-ammoProperty.deviation, ammoProperty.deviation)
- multiProjectile.target_pos.y = projectile.target_pos.y + math.random(-ammoProperty.deviation, ammoProperty.deviation)
- multiProjectile.target_pos.z = projectile.target_pos.z
- multiProjectile.flags.no_impact_destroy = false
- multiProjectile.flags.bouncing = false
- multiProjectile.flags.piercing = projectile.flags.piercing
- multiProjectile.flags.parabolic = false
- multiProjectile.flags.unk9 = false
- multiProjectile.flags.no_collide = false
- multiProjectile.distance_flown = 6 -- pretend its already flown 6 tiles to prevent the smoke function from triggering on these
- multiProjectile.fall_threshold = projectile.fall_threshold
- multiProjectile.min_hit_distance = projectile.min_hit_distance
- multiProjectile.min_ground_distance = projectile.min_ground_distance
- multiProjectile.fall_counter = 0
- multiProjectile.fall_delay = 0
- multiProjectile.hit_rating = projectile.hit_rating
- multiProjectile.unk22 = projectile.unk22
- multiProjectile.bow_id = projectile.bow_id
- multiProjectile.unk_v40_1 = projectile.unk_v40_1
- multiProjectile.speed_x = projectile.speed_x
- multiProjectile.speed_y = projectile.speed_x
- multiProjectile.speed_z = projectile.speed_x
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement