Advertisement
Guest User

blam

a guest
Aug 26th, 2018
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.90 KB | None | 0 0
  1. --mod-projectile--
  2. --creates smoke and can modify various properties of any projectile.
  3. --author Grimlocke
  4. --(heavily) based on scripts by zaporozhets
  5. --who on turn based his work on scripts by expwnent and Putnam
  6.  
  7. local eventful = require 'plugins.eventful'
  8.  
  9. ammoProperties = {
  10.     [ "ITEM_AMMO_GUN_20MM_BALL" ] = { deviation = 5, hitrateMod = 5, velocityMult = 1, rateMult = 0.35, breakChance = 100, piercing = false, shotCount = 1, shotItem = "NOPE" },
  11.    
  12.     [ "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" },
  13.    
  14.     [ "ITEM_AMMO_GUN_35MM_BALL" ] = { deviation = 10, hitrateMod = 10, velocityMult = 1.2, rateMult = 0.40, breakChance = 100, piercing = false, shotCount = 1, shotItem = "NOPE" },
  15.    
  16.     [ "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" },
  17.    
  18.     [ "ITEM_AMMO_THROW_DART" ] = { deviation = 2, hitrateMod = 2, velocityMult = 1, rateMult = 1.2, breakChance = 20, piercing = false, shotCount = 1, shotItem = "NOPE" },
  19.    
  20.     [ "ITEM_AMMO_THROW_JAVELIN" ] = { deviation = 2, hitrateMod = 2, velocityMult = 1, rateMult = 1.2, breakChance = 20, piercing = false, shotCount = 1, shotItem = "NOPE" },
  21.    
  22.     [ "ITEM_AMMO_BOLTS" ] = { deviation = 0, hitrateMod = 0, velocityMult = 1, rateMult = 0.7, breakChance = 60, piercing = false, shotCount = 1, shotItem = "NOPE" },
  23.  
  24.     [ "ITEM_AMMO_BOLTS_BROADHEAD" ] = { deviation = 0, hitrateMod = 0, velocityMult = 1, rateMult = 0.7, breakChance = 60, piercing = false, shotCount = 1, shotItem = "NOPE" },
  25.    
  26.     [ "ITEM_AMMO_ARROWS" ] = { deviation = 2, hitrateMod = 2, velocityMult = 1, rateMult = 1, breakChance = 75, piercing = false, shotCount = 1, shotItem = "NOPE" },
  27.    
  28.     [ "ITEM_AMMO_ARROWS_BARBED" ] = { deviation = 2, hitrateMod = 2, velocityMult = 1, rateMult = 1, breakChance = 75, piercing = false, shotCount = 1, shotItem = "NOPE" },
  29.    
  30.     [ "ITEM_AMMO_ARROWS_SWALLOWTAIL" ] = { deviation = 2, hitrateMod = 2, velocityMult = 1, rateMult = 1, breakChance = 75, piercing = false, shotCount = 1, shotItem = "NOPE" },
  31.    
  32.     [ "ITEM_AMMO_ARROWS_FORKHEAD" ] = { deviation = 2, hitrateMod = 2, velocityMult = 1, rateMult = 1, breakChance = 75, piercing = false, shotCount = 1, shotItem = "NOPE" }
  33. }
  34.  
  35. eventful.onProjItemCheckMovement.blam = function(projectile)
  36.     if projectile.distance_flown == 0 and projectile.firer ~= nil then
  37.         ammoProperty = ammoProperties[dfhack.items.getSubtypeDef(projectile.item:getType(),projectile.item:getSubtype()).id]
  38.         if ammoProperty ~= nil then
  39.             projectileMod(projectile, ammoProperty)
  40.             multiShot(projectile, ammoProperty)
  41.         end
  42.     elseif projectile.distance_flown == 1 then
  43.         bulletSmoke(projectile, 5)
  44.     elseif projectile.distance_flown == 2 then
  45.         bulletSmoke(projectile, 10)
  46.     elseif projectile.distance_flown == 3 then
  47.         bulletSmoke(projectile, 25)
  48.     elseif projectile.distance_flown == 5 then
  49.         bulletSmoke(projectile, 35)
  50.     end
  51. end
  52.  
  53. function bulletSmoke(projectile, amount)
  54.     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
  55.         dfhack.maps.spawnFlow(projectile.cur_pos, 5, -1, -1, amount)
  56.     elseif string.match(dfhack.items.getSubtypeDef(projectile.item:getType(),projectile.item:getSubtype()).id, "ITEM_AMMO_CANNON") and projectile.firer ~= nil then
  57.         dfhack.maps.spawnFlow(projectile.cur_pos, 5, -1, -1, 1.25 * amount)
  58.     end
  59. end
  60.  
  61. function projectileMod(projectile, ammoProperty)
  62.     projectile.target_pos.x = projectile.target_pos.x + math.random(-ammoProperty.deviation, ammoProperty.deviation)
  63.     projectile.target_pos.y = projectile.target_pos.y + math.random(-ammoProperty.deviation, ammoProperty.deviation)
  64.     projectile.unk22 = math.floor(projectile.unk22 * ammoProperty.velocityMult)
  65.     projectile.firer.counters.think_counter = math.floor(projectile.firer.counters.think_counter / ammoProperty.rateMult)
  66.     projectile.hit_rating = projectile.hit_rating + ammoProperty.hitrateMod
  67.     projectile.flags.no_impact_destroy = math.floor((100 - ammoProperty.breakChance) / math.random(0, 100))
  68.     projectile.flags.piercing = ammoProperty.piercing
  69.     if ammoProperty.shotItem ~= "NOPE" then
  70.         print(ammoProperty.shotItem)
  71.         -- projectile.item:setType(dfhack.items.findType(shotItem)) doesn't work, no table launcher for now :(
  72.         projectile.item:setSubtype(dfhack.items.findSubtype(ammoProperty.shotItem))
  73.     end
  74.     print(projectile.bow_id, projectile.item, projectile.unk22, projectile.hit_rating, dfhack.items.getSubtypeDef(projectile.item:getType(),projectile.item:getSubtype()).id)
  75. end
  76.  
  77. function multiShot(projectile, ammoProperty)
  78.     for i = 0, ammoProperty.shotCount - 2, 1 do
  79.         local shot = projectile.item
  80.         local multi = df.item.find(dfhack.items.createItem(shot:getType(), shot:getSubtype(), shot.mat_type, shot.mat_index, projectile.firer))
  81.         multi.flags.forbid = true
  82.         local multiProjectile = dfhack.items.makeProjectile(multi)
  83.         multiProjectile.origin_pos.x = projectile.origin_pos.x -- + math.random(-1, 1)
  84.         multiProjectile.origin_pos.y = projectile.origin_pos.y -- + math.random(-1, 1)
  85.         multiProjectile.origin_pos.z = projectile.origin_pos.z
  86.         multiProjectile.prev_pos.x = projectile.origin_pos.x
  87.         multiProjectile.prev_pos.y = projectile.origin_pos.y
  88.         multiProjectile.prev_pos.z = projectile.origin_pos.z
  89.         multiProjectile.cur_pos.x = projectile.origin_pos.x
  90.         multiProjectile.cur_pos.y = projectile.origin_pos.y
  91.         multiProjectile.cur_pos.z = projectile.origin_pos.z
  92.         multiProjectile.target_pos.x = projectile.target_pos.x + math.random(-ammoProperty.deviation, ammoProperty.deviation)
  93.         multiProjectile.target_pos.y = projectile.target_pos.y + math.random(-ammoProperty.deviation, ammoProperty.deviation)
  94.         multiProjectile.target_pos.z = projectile.target_pos.z
  95.         multiProjectile.flags.no_impact_destroy = false
  96.         multiProjectile.flags.bouncing = false
  97.         multiProjectile.flags.piercing = projectile.flags.piercing
  98.         multiProjectile.flags.parabolic = false
  99.         multiProjectile.flags.unk9 = false
  100.         multiProjectile.flags.no_collide = false
  101.         multiProjectile.distance_flown = 6 -- pretend its already flown 6 tiles to prevent the smoke function from triggering on these
  102.         multiProjectile.fall_threshold = projectile.fall_threshold
  103.         multiProjectile.min_hit_distance = projectile.min_hit_distance
  104.         multiProjectile.min_ground_distance = projectile.min_ground_distance
  105.         multiProjectile.fall_counter = 0
  106.         multiProjectile.fall_delay = 0
  107.         multiProjectile.hit_rating = projectile.hit_rating
  108.         multiProjectile.unk22 = projectile.unk22
  109.         multiProjectile.bow_id = projectile.bow_id
  110.         multiProjectile.unk_v40_1 = projectile.unk_v40_1
  111.         multiProjectile.speed_x = projectile.speed_x
  112.         multiProjectile.speed_y = projectile.speed_x
  113.         multiProjectile.speed_z = projectile.speed_x
  114.     end
  115. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement