Advertisement
kevinz000

Untitled

Apr 29th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.31 KB | None | 0 0
  1.  
  2. /obj/item/weapon/gun/energy/beam_rifle
  3. name = "particle acceleration rifle"
  4. desc = "A powerful marksman rifle that uses highly focused particle beams to obliterate targets."
  5. icon = 'icons/obj/guns/energy.dmi'
  6. icon_state = "esniper"
  7. item_state = "esniper"
  8. fire_sound = 'sound/weapons/beam_sniper.ogg'
  9. slot_flags = SLOT_BACK
  10. force = 15
  11. materials = list()
  12. origin_tech = ""
  13. recoil = 5
  14. ammo_x_offset = 3
  15. ammo_y_offset = 3
  16. modifystate = FALSE
  17. zoomable = TRUE
  18. zoom_amt = 20
  19. zoom_out_amt = 23
  20. weapon_weight = WEAPON_HEAVY
  21. w_class = WEIGHT_CLASS_HUGE
  22. ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan, /obj/item/ammo_casing/energy/beam_rifle/hitscan/explosive)
  23. var/power = 20
  24. var/maxpower = 20
  25. var/energy_coeff = 0.20
  26. var/hipfire_inaccuracy = 4
  27. var/hipfire_recoil = 10
  28. var/scoped_inaccuracy = 0
  29. var/scoped_recoil = 5
  30. var/scoped = FALSE
  31. var/noscope = FALSE //Can you fire this without a scope?
  32. var/obj/item/weapon/stock_parts/capacitor/cap = new /obj/item/weapon/stock_parts/capacitor
  33. var/obj/item/weapon/stock_parts/scanning_module/scan = new /obj/item/weapon/stock_parts/scanning_module
  34. var/obj/item/weapon/stock_parts/manipulator/manip = new /obj/item/weapon/stock_parts/manipulator
  35. var/obj/item/weapon/stock_parts/micro_laser/laser = new /obj/item/weapon/stock_parts/micro_laser
  36. var/obj/item/weapon/stock_parts/matter_bin/bin = new /obj/item/weapon/stock_parts/matter_bin
  37. cell_type = /obj/item/weapon/stock_parts/cell/beam_rifle
  38. var/datum/action/item_action/beam_rifle_power/poweraction
  39. canMouseDown = TRUE
  40. var/aiming = FALSE
  41. var/aiming_time = 10
  42. var/aiming_time_fire_threshold = 2
  43. var/aiming_time_left = 10
  44. var/aiming_time_increase_user_movement = 3
  45. var/aiming_time_increase_per_pixel = 2
  46. var/aiming_time_increase_range_falloff = 1
  47. var/mob/current_user = null
  48. var/list/obj/effect/overlay/temp/current_tracers = list()
  49.  
  50. /obj/item/weapon/gun/energy/beam_rifle/debug
  51. aiming_time = 0
  52. aiming_time_fire_threshold = 0
  53. noscope = TRUE
  54. scoped_recoil = 0
  55. hipfire_recoil = 0
  56. hipfire_inaccuracy = 0
  57. maxpower = 2000
  58. cell_type = /obj/item/weapon/stock_parts/cell/infinite
  59.  
  60. /obj/item/weapon/gun/energy/beam_rifle/debug/update_stats()
  61. return
  62.  
  63. /obj/item/weapon/gun/energy/beam_rifle/debug/Initialize()
  64. ..()
  65. for(var/obj/item/ammo_casing/A in contents)
  66. A.delay = 0
  67.  
  68. /obj/item/weapon/gun/energy/beam_rifle/New()
  69. ..()
  70. poweraction = new()
  71. poweraction.gun = src
  72. START_PROCESSING(SSfastprocess, src)
  73.  
  74. /obj/item/weapon/gun/energy/beam_rifle/Destroy()
  75. STOP_PROCESSING(SSfastprocess, src)
  76. ..()
  77.  
  78. /obj/item/weapon/gun/energy/beam_rifle/pickup(mob/user)
  79. if(poweraction)
  80. poweraction.Grant(user)
  81. . = ..()
  82.  
  83. /obj/item/weapon/gun/energy/beam_rifle/dropped(mob/user)
  84. if(poweraction)
  85. poweraction.Remove(user)
  86. . = ..()
  87.  
  88. /obj/item/weapon/gun/energy/beam_rifle/proc/update_stats()
  89. maxpower = laser.rating*20
  90. if(maxpower > power)
  91. power = maxpower
  92. energy_coeff = (1 - (cap*0.1875))
  93. scoped_recoil = 5 - bin.rating
  94. hipfire_recoil = 10 - bin.rating*2
  95. hipfire_inaccuracy = Clamp((30 - (manip.rating * 5)), 0, 30)
  96. for(var/obj/item/ammo_casing/energy/beam_rifle/BR in ammo_type)
  97. BR.base_energy_multiplier = (initial(BR.base_energy_multiplier) * (1 - (scan.rating * 0.075)))
  98. BR.e_cost = round((power * BR.base_energy_multiplier)*energy_coeff)
  99. BR.update_damage(power)
  100.  
  101. /obj/item/weapon/gun/energy/beam_rifle/zoom(user, forced_zoom)
  102. . = ..()
  103. scope(user, .)
  104.  
  105. /obj/item/weapon/gun/energy/beam_rifle/proc/scope(mob/user, forced)
  106. var/scoping
  107. switch(forced)
  108. if(TRUE)
  109. scoping = TRUE
  110. if(FALSE)
  111. scoping = FALSE
  112. else
  113. scoping = !scoped
  114. if(scoping)
  115. spread = scoped_inaccuracy
  116. recoil = scoped_recoil
  117. scoped = TRUE
  118. user << "<span class='boldnotice'>You bring your [src] up and use its scope...</span>"
  119. else
  120. spread = hipfire_inaccuracy
  121. recoil = hipfire_recoil
  122. scoped = FALSE
  123. user << "<span class='boldnotice'>You lower your [src].</span>"
  124.  
  125. /obj/item/weapon/gun/energy/beam_rifle/can_trigger_gun(var/mob/living/user)
  126. if(!scoped && !noscope)
  127. user << "<span class='userdanger'>This beam rifle can only be used while scoped!</span>"
  128. return FALSE
  129. . = ..(user)
  130.  
  131. /obj/item/weapon/gun/energy/beam_rifle/attackby(obj/item/I, mob/user, params)
  132. if(istype(I, /obj/item/weapon/stock_parts))
  133. var/obj/item/weapon/stock_parts/S = I
  134. if(istype(S, /obj/item/weapon/stock_parts/manipulator))
  135. to_chat(user, "[I] has been sucessfully installed into systems.")
  136. if(user.transferItemToLoc(I, src))
  137. if(manip)
  138. manip.forceMove(get_turf(src))
  139. manip = null
  140. manip = I
  141. if(istype(S, /obj/item/weapon/stock_parts/scanning_module))
  142. to_chat(user, "[I] has been sucessfully installed into systems.")
  143. if(user.transferItemToLoc(I, src))
  144. if(scan)
  145. scan.forceMove(get_turf(src))
  146. scan = null
  147. scan = I
  148. if(istype(S, /obj/item/weapon/stock_parts/micro_laser))
  149. to_chat(user, "[I] has been sucessfully installed into systems.")
  150. if(user.transferItemToLoc(I, src))
  151. if(laser)
  152. laser.forceMove(get_turf(src))
  153. laser = null
  154. laser = I
  155. if(istype(S, /obj/item/weapon/stock_parts/matter_bin))
  156. to_chat(user, "[I] has been sucessfully installed into systems.")
  157. if(user.transferItemToLoc(I, src))
  158. if(bin)
  159. bin.forceMove(get_turf(src))
  160. bin = null
  161. bin = I
  162. if(istype(S, /obj/item/weapon/stock_parts/capacitor))
  163. to_chat(user, "[I] has been sucessfully installed into systems.")
  164. if(user.transferItemToLoc(I, src))
  165. if(cap)
  166. cap.forceMove(get_turf(src))
  167. cap = null
  168. cap = I
  169. . = ..(I, user, params)
  170.  
  171. /obj/item/weapon/gun/energy/beam_rifle/emp_act(severity)
  172. chambered = null
  173. recharge_newshot()
  174. return //Energy drain handled by its cell.
  175.  
  176. /obj/item/weapon/gun/energy/beam_rifle/proc/select_power(mob/user)
  177. var/powerpercent = 50
  178. powerpercent = round(input("Set [src] to percentage power","Adjust power output", null) as num|null)
  179. powerpercent = Clamp(powerpercent, 0, 100)
  180. if(powerpercent)
  181. power = ((100/maxpower) * powerpercent)
  182. user << "<span class='boldnotice'>[src] set to [powerpercent]% power.</span>"
  183. update_stats()
  184.  
  185. /datum/action/item_action/beam_rifle_power
  186. name = "Adjust Power Output"
  187. var/obj/item/weapon/gun/energy/beam_rifle/gun
  188. button_icon_state = "esniper_power"
  189. background_icon_state = "bg_tech_red"
  190.  
  191. /datum/action/item_action/beam_rifle_power/Trigger()
  192. gun.select_power(owner)
  193. . = ..()
  194.  
  195. /obj/item/weapon/gun/energy/beam_rifle/proc/aiming_beam()
  196. var/atom/A = current_user.client.mouseObject
  197. if(!istype(A) || !A.loc)
  198. return
  199. var/turf/T = get_turf(current_user.client.mouseObject)
  200. if(!istype(T))
  201. return
  202. var/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/P = new
  203. P.gun = src
  204. P.preparePixelProjectile(current_user.client.mouseObject, T, current_user, current_user.client.mouseParams, 0)
  205. if(aiming_time >= 1)
  206. var/percent = ((100/aiming_time)*aiming_time_left)
  207. P.color = rgb(255 * percent,255 * (100 - percent),0)
  208. else
  209. P.color = rgb(0, 255, 0)
  210. P.fire()
  211. for(var/obj/effect/overlay/temp/O in current_tracers)
  212. T.alpha = 0
  213. current_tracers -= O
  214.  
  215. /obj/item/weapon/gun/energy/beam_rifle/process()
  216. if(!aiming)
  217. return
  218. if(aiming_time_left > 0)
  219. aiming_time_left--
  220. aiming_beam()
  221.  
  222. /obj/item/weapon/gun/energy/beam_rifle/proc/start_aiming()
  223. aiming_time_left = aiming_time
  224. aiming = TRUE
  225.  
  226. /obj/item/weapon/gun/energy/beam_rifle/proc/stop_aiming()
  227. aiming_time_left = aiming_time
  228. aiming = FALSE
  229.  
  230. /obj/item/weapon/gun/energy/beam_rifle/onMouseDrag(src_object, over_object, src_location, over_location, params, mob)
  231. current_user = mob
  232.  
  233. /obj/item/weapon/gun/energy/beam_rifle/onMouseDown(object, location, params, mob)
  234. start_aiming()
  235. current_user = mob
  236.  
  237. /obj/item/weapon/gun/energy/beam_rifle/onMouseUp(object, location, params, mob/M)
  238. if(aiming_time_left <= aiming_time_fire_threshold)
  239. afterattack(M.client.mouseObject, M, FALSE, M.client.mouseParams, passthrough = TRUE)
  240. stop_aiming()
  241.  
  242. /obj/item/weapon/gun/energy/beam_rifle/afterattack(atom/target, mob/living/user, flag, params, passthrough = FALSE)
  243. if(!passthrough && (aiming_time > aiming_time_fire_threshold))
  244. return
  245. . = ..()
  246.  
  247. /obj/item/weapon/gun/energy/beam_rifle/proc/delay_penalty(amount)
  248. aiming_time_left = Clamp(aiming_time_left + amount, 0, aiming_time)
  249.  
  250. /obj/item/ammo_casing/energy/beam_rifle
  251. name = "particle acceleration lens"
  252. desc = "Don't look into barrel!"
  253. var/base_energy_multiplier = 0
  254. var/projectile_damage = 20
  255.  
  256. /obj/item/ammo_casing/energy/beam_rifle/proc/update_damage(power)
  257. projectile_damage = power
  258.  
  259. /obj/item/ammo_casing/energy/beam_rifle/hitscan/ready_proj(atom/target, mob/living/user, quiet, zone_override)
  260. BB.damage = projectile_damage
  261. . = ..(target, user, quiet, zone_override)
  262.  
  263. /obj/item/ammo_casing/energy/beam_rifle/hitscan
  264. projectile_type = /obj/item/projectile/beam/beam_rifle/hitscan
  265. select_name = "narrow-beam"
  266. e_cost = 500
  267. base_energy_multiplier = 62.5 //4x the damage of an egun on lethal at full charge.
  268. fire_sound = 'sound/weapons/beam_sniper.ogg'
  269. delay = 40
  270.  
  271. /obj/item/ammo_casing/energy/beam_rifle/hitscan/explosive
  272. projectile_type = /obj/item/projectile/beam/beam_rifle/hitscan/explosive
  273. select_name = "explosive-beam"
  274. e_cost = 1000
  275. base_energy_multiplier = 125 //2x the damage of an egun on lethal at full charge, but AOE damage.
  276. var/area_damage = 20
  277. var/burn_chance = 20
  278.  
  279. /obj/item/ammo_casing/energy/beam_rifle/hitscan/explosive/update_damage(damage)
  280. projectile_damage = 0
  281. area_damage = damage
  282. burn_chance = damage
  283.  
  284. /obj/item/ammo_casing/energy/beam_rifle/hitscan/explosive/ready_proj()
  285. ..()
  286. var/obj/item/projectile/beam/beam_rifle/hitscan/explosive/E = BB
  287. E.area_damage = area_damage
  288. E.burn_chance = burn_chance
  289.  
  290. /obj/item/projectile/beam/beam_rifle
  291. name = "particle beam"
  292. icon = ""
  293. //hitsound = ''
  294. //hitsound_wall = ''
  295. damage = 20
  296. damage_type = BURN
  297. flag = "energy"
  298. range = 150
  299. jitter = 10
  300. var/obj/item/weapon/gun/energy/beam_rifle/gun
  301. //impact_effect_type = ""
  302.  
  303. /obj/item/projectile/beam/beam_rifle/hitscan
  304. icon_state = ""
  305. var/tracer_type = /obj/effect/overlay/temp/projectile_beam/tracer
  306.  
  307. /obj/item/projectile/beam/beam_rifle/hitscan/fire(setAngle, atom/direct_target) //oranges didn't let me make this a var the first time around so copypasta time
  308. set waitfor = 0
  309. if(!log_override && firer && original)
  310. add_logs(firer, original, "fired at", src, " [get_area(src)]")
  311. if(setAngle)
  312. Angle = setAngle
  313. var/next_run = world.time
  314. var/old_pixel_x = pixel_x
  315. var/old_pixel_y = pixel_y
  316. while(loc)
  317. if((!( current ) || loc == current))
  318. current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
  319. if(!Angle)
  320. Angle=round(Get_Angle(src,current))
  321. if(spread)
  322. Angle += (rand() - 0.5) * spread
  323. var/matrix/M = new
  324. M.Turn(Angle)
  325. transform = M
  326. var/Pixel_x=sin(Angle)+16*sin(Angle)*2
  327. var/Pixel_y=cos(Angle)+16*cos(Angle)*2
  328. var/pixel_x_offset = old_pixel_x + Pixel_x
  329. var/pixel_y_offset = old_pixel_y + Pixel_y
  330. var/new_x = x
  331. var/new_y = y
  332. while(pixel_x_offset > 16)
  333. pixel_x_offset -= 32
  334. old_pixel_x -= 32
  335. new_x++// x++
  336. while(pixel_x_offset < -16)
  337. pixel_x_offset += 32
  338. old_pixel_x += 32
  339. new_x--
  340. while(pixel_y_offset > 16)
  341. pixel_y_offset -= 32
  342. old_pixel_y -= 32
  343. new_y++
  344. while(pixel_y_offset < -16)
  345. pixel_y_offset += 32
  346. old_pixel_y += 32
  347. new_y--
  348. pixel_x = old_pixel_x
  349. pixel_y = old_pixel_y
  350. step_towards(src, locate(new_x, new_y, z))
  351. next_run += max(world.tick_lag, speed)
  352. var/delay = next_run - world.time
  353. if(delay <= world.tick_lag*2)
  354. pixel_x = pixel_x_offset
  355. pixel_y = pixel_y_offset
  356. else
  357. animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (delay <= 3 ? delay - 1 : delay)), flags = ANIMATION_END_NOW)
  358. old_pixel_x = pixel_x_offset
  359. old_pixel_y = pixel_y_offset
  360. if(original && (original.layer>=2.75) || ismob(original))
  361. if(loc == get_turf(original))
  362. if(!(original in permutated))
  363. Bump(original, 1)
  364. Range()
  365.  
  366. /obj/item/projectile/beam/beam_rifle/hitscan/Range()
  367. spawn_tracer_effect()
  368.  
  369. /obj/item/projectile/beam/beam_rifle/hitscan/proc/spawn_tracer_effect()
  370. new tracer_type(loc, time = 5, angle_override = Angle, p_x = pixel_x, p_y = pixel_y, color_override = color)
  371.  
  372. /obj/item/projectile/beam/beam_rifle/hitscan/on_hit(atom/target, blocked = 0)
  373. . = ..(target, blocked)
  374. if(!ismob(target))
  375. target.ex_act(2)
  376.  
  377. /obj/item/projectile/beam/beam_rifle/hitscan/explosive
  378. damage = 0
  379. var/area_damage = 10
  380. var/burn_chance = 33
  381.  
  382. /obj/item/projectile/beam/beam_rifle/hitscan/explosive/on_hit(atom/target, blocked = 0)
  383. . = ..()
  384. new /obj/effect/overlay/temp/explosion/fast(get_turf(target))
  385. for(var/atom/A in range(5, get_turf(target)))
  386. if(isobj(A))
  387. var/obj/O = A
  388. O.take_damage(area_damage, BURN, "energy", FALSE)
  389. if(isliving(A))
  390. var/mob/living/L = A
  391. to_chat(L, "<span class='userdanger'>You are seared by the [src]!</span>")
  392. L.adjustFireLoss(area_damage)
  393. if(isturf(A))
  394. var/turf/T = A
  395. if(prob(burn_chance))
  396. T.hotspot_expose()
  397. playsound(get_turf(target), 'sound/effects/Explosion1.ogg', 100, 1)
  398.  
  399. /obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam
  400. tracer_type = /obj/effect/overlay/temp/projectile_beam/tracer/aiming
  401. name = "aiming beam"
  402. hitsound = null
  403. hitsound_wall = null
  404.  
  405. /obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/prehit()
  406. qdel(src)
  407. return FALSE
  408.  
  409. /obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/spawn_tracer_effect()
  410. var/obj/effect/overlay/temp/projectile_beam/T = new tracer_type(loc, time = 5, angle_override = Angle, p_x = pixel_x, p_y = pixel_y, color_override = color)
  411. if(istype(gun) && istype(T))
  412. gun.current_tracers += T
  413.  
  414. /obj/effect/overlay/temp/projectile_beam
  415. icon = 'icons/obj/projectiles.dmi'
  416. layer = ABOVE_MOB_LAYER
  417. anchored = 1
  418. duration = 5
  419. randomdir = FALSE
  420.  
  421. /obj/effect/overlay/temp/projectile_beam/New(time = 5, angle_override, p_x, p_y, color_override)
  422. duration = time
  423. if(isnull(angle_override)||isnull(p_x)|isnull(p_y))
  424. qdel(src)
  425. pixel_x = p_x
  426. pixel_y = p_y
  427. var/matrix/M = new
  428. M.Turn(angle_override)
  429. transform = M
  430. if(color_override)
  431. color = color_override
  432. ..()
  433.  
  434. /obj/effect/overlay/temp/projectile_beam/tracer
  435. icon_state = "tracer_beam"
  436.  
  437. /obj/effect/overlay/temp/projectile_beam/tracer/aiming
  438. icon_state = "gbeam"
  439. duration = 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement