diff --git a/code/defines/obj.dm b/code/defines/obj.dm index fd4dc7d4d9..43dd9277a9 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -742,6 +742,7 @@ density = 1 flags = FPRINT anchored = 1.0 + throwpass = 1 //You can throw objects over this, despite it's density. /obj/effect/shut_controller name = "shut controller" @@ -814,6 +815,7 @@ density = 1 anchored = 1.0 layer = 2.8 + throwpass = 1 //You can throw objects over this, despite it's density. New() ..() diff --git a/code/defines/obj/vending.dm b/code/defines/obj/vending.dm index 1b9582f561..648886f8f2 100755 --- a/code/defines/obj/vending.dm +++ b/code/defines/obj/vending.dm @@ -161,7 +161,7 @@ product_hidden = "/obj/item/weapon/lighter/zippo" // product_hideamt = "4" hidden_prices = "2" - product_coin = "/obj/item/clothing/mask/cigarette/cigar/havanian" + product_coin = "/obj/item/clothing/mask/cigarette/cigar/havana" product_coin_amt = "2" product_ads = "Probably not bad for you!;Don't believe the scientists!;It's good for you!;Don't quit, buy more!;Smoke!;Nicotine heaven.;Best cigarettes since 2150.;Award-winning cigs." charge_type = "cigarette" diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index ac53cf357d..7ddcaa0597 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -3,6 +3,8 @@ CONTAINS: MATCHES MATCHBOXES CIGARETTES +CIGARS +SMOKING PIPES CIG PACKET ZIPPO */ @@ -22,10 +24,7 @@ ZIPPO process() - var/turf/location = get_turf(src) - if(src.lit == 1) - if(location) - location.hotspot_expose(700, 5) + while(src.lit == 1) src.smoketime-- sleep(10) if(src.smoketime < 1) @@ -37,16 +36,12 @@ ZIPPO dropped(mob/user as mob) if(src.lit == 1) - spawn(10) - var/turf/location = get_turf(src) - location.hotspot_expose(700, 5) - src.lit = -1 - src.damtype = "brute" - src.icon_state = "match_burnt" - src.item_state = "cigoff" - src.name = "Burnt match" - src.desc = "A match that has been burnt" - processing_objects.Remove(src) + src.lit = -1 + src.damtype = "brute" + src.icon_state = "match_burnt" + src.item_state = "cigoff" + src.name = "Burnt match" + src.desc = "A match that has been burnt" return ..() @@ -74,7 +69,11 @@ ZIPPO else src.matchcount-- var/obj/item/weapon/match/W = new /obj/item/weapon/match(user) - user.put_in_hand(W) + if(user.hand) + user.l_hand = W + else + user.r_hand = W + W.layer = 20 else return ..() if(src.matchcount <= 0) @@ -115,13 +114,23 @@ ZIPPO lit = 0 icon_on = "cigon" //Note - these are in masks.dmi not in cigarette.dmi icon_off = "cigoff" - icon_butt = "cigbutt" + type_butt = /obj/item/weapon/cigbutt lastHolder = null smoketime = 300 - var/butt_count = 5 //count of butt sprite variations + icon_butt = "cigbutt" + butt_count = 5 //count of butt sprite variations proc light(var/flavor_text = "[usr] lights the [name].") + put_out() + if (src.lit == -1) + return + src.lit = -1 + src.damtype = "brute" + src.icon_state = icon_butt + "[rand(0,butt_count)]" + src.item_state = icon_off + src.desc = "A [src.name] butt." + src.name = "[src.name] butt" attackby(obj/item/weapon/W as obj, mob/user as mob) ..() @@ -149,29 +158,18 @@ ZIPPO O.show_message(flavor_text, 1) processing_objects.Add(src) - put_out() - if (src.lit == -1) - return - src.lit = -1 - src.damtype = "brute" - src.icon_state = icon_butt + "[rand(0,butt_count)]" - src.item_state = icon_off - src.desc = "A [src.name] butt." - src.name = "[src.name] butt" process() var/turf/location = get_turf(src) src.smoketime-- if(src.smoketime < 1) + new type_butt(location) if(ismob(src.loc)) var/mob/living/M = src.loc M << "\red Your [src.name] goes out." - put_out() - M.update_clothing() - else - put_out() processing_objects.Remove(src) + del(src) return if(location) location.hotspot_expose(700, 5) @@ -180,11 +178,15 @@ ZIPPO dropped(mob/user as mob) if(src.lit == 1) - src.visible_message("\red [user] calmly drops and treads on the lit [src], putting it out instantly.") - put_out() + for(var/mob/O in viewers(user, null)) + O.show_message(text("\red [] calmly drops and treads on the lit [], putting it out instantly.", user,src.name), 1) + new type_butt(loc) + processing_objects.Remove(src) + del(src) return ..() + //////////// // CIGARS // //////////// @@ -194,11 +196,10 @@ ZIPPO icon_state = "cigaroff" icon_on = "cigaron" icon_off = "cigaroff" - icon_butt = "cigarbutt" + type_butt = /obj/item/weapon/cigbutt throw_speed = 0.5 item_state = "cigaroff" smoketime = 1500 - butt_count = 0 /obj/item/clothing/mask/cigarette/cigar/cohiba name = "Cohiba Robusto Cigar" @@ -207,7 +208,7 @@ ZIPPO icon_on = "cigar2on" icon_off = "cigar2off" -/obj/item/clothing/mask/cigarette/cigar/havanian +/obj/item/clothing/mask/cigarette/cigar/havana name = "Premium Havanian Cigar" desc = "A cigar fit for only the best for the best." icon_state = "cigar2off" @@ -218,20 +219,116 @@ ZIPPO /obj/item/weapon/cigbutt name = "cigarette butt" desc = "A manky old cigarette butt." - icon = 'cigarettes.dmi' + icon = 'masks.dmi' icon_state = "cigbutt" w_class = 1 throwforce = 1 -/obj/item/weapon/cigarbutt - name = "Cigar butt" +/obj/item/weapon/cigbutt/cigarbutt + name = "cigar butt" desc = "A manky old cigar butt." - icon = 'cigarettes.dmi' icon_state = "cigarbutt" - w_class = 1 - throwforce = 1 +/obj/item/clothing/mask/cigarette/cigar/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/match)) + ..() + else + user << "\red The [src] straight out REFUSES to be lit by such uncivilized means." + +///////////////// +//SMOKING PIPES// +///////////////// + +/obj/item/clothing/mask/pipe + name = "smoking pipe" + desc = "A pipe, for smoking. Probably made of meershaum or something." + icon_state = "cobpipeoff" + throw_speed = 0.5 + item_state = "cobpipeoff" + w_class = 1 + body_parts_covered = null + var + lit = 0 + icon_on = "cobpipeon" //Note - these are in masks.dmi + icon_off = "cobpipeoff" + lastHolder = null + smoketime = 100 + maxsmoketime = 100 //make sure this is equal to your smoketime + proc + light(var/flavor_text = "[usr] lights the [name].") + + attackby(obj/item/weapon/W as obj, mob/user as mob) + ..() + if(istype(W, /obj/item/weapon/weldingtool) && W:welding) + light("\red [user] casually lights the [name] with [W], what a badass.") + + else if(istype(W, /obj/item/weapon/lighter/zippo) && (W:lit > 0)) + light("\red With a single flick of their wrist, [user] smoothly lights their [name] with their [W]. Damn they're cool.") + + else if(istype(W, /obj/item/weapon/lighter) && (W:lit > 0)) + light("\red After some fiddling, [user] manages to light their [name] with [W].") + + else if(istype(W, /obj/item/weapon/match) && (W:lit > 0)) + light("\red [user] lights \his [name] with \his [W].") + return + + light(var/flavor_text = "[usr] lights the [name].") + if(!src.lit) + src.lit = 1 + src.damtype = "fire" + src.icon_state = icon_on + src.item_state = icon_on + for(var/mob/O in viewers(usr, null)) + O.show_message(flavor_text, 1) + processing_objects.Add(src) + + process() + var/turf/location = get_turf(src) + src.smoketime-- + if(src.smoketime < 1) + new /obj/effect/decal/ash(location) + if(ismob(src.loc)) + var/mob/living/M = src.loc + M << "\red Your [src.name] goes out, and you empty the ash." + src.lit = 0 + src.icon_state = icon_off + src.item_state = icon_off + processing_objects.Remove(src) + return + if(location) + location.hotspot_expose(700, 5) + return + + dropped(mob/user as mob) + if(src.lit == 1) + for(var/mob/O in viewers(user, null)) + O.show_message(text("\red [] puts out the [].", user,src.name), 1) + src.lit = 0 + src.icon_state = icon_off + src.item_state = icon_off + processing_objects.Remove(src) + return ..() + +/obj/item/clothing/mask/pipe/attack_self(mob/user as mob) //Refills the pipe. Can be changed to an attackby later, if loose tobacco is added to vendors or something. + if(src.smoketime <= 0) + user << "\blue You refill the pipe with tobacco." + smoketime = maxsmoketime + return + +/obj/item/clothing/mask/pipe/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/match)) + ..() + else + user << "\red The [src] straight out REFUSES to be lit by such means." + + +/obj/item/clothing/mask/pipe/cobpipe + name = "corn cob pipe" + desc = "A nicotine delivery system popularized by folksy backwoodsmen and kept popular in the modern age and beyond by space hipsters." + smoketime = 400 + maxsmoketime = 400 + //////////// //CIG PACK// //////////// @@ -262,7 +359,11 @@ ZIPPO else src.cigcount-- var/obj/item/clothing/mask/cigarette/W = new /obj/item/clothing/mask/cigarette(user) - user.put_in_hand(W) + if(user.hand) + user.l_hand = W + else + user.r_hand = W + W.layer = 20 else return ..() src.update_icon() diff --git a/code/game/throwing.dm b/code/game/throwing.dm index 9560bed0ef..9d9f9ea329 100644 --- a/code/game/throwing.dm +++ b/code/game/throwing.dm @@ -107,11 +107,13 @@ src.throw_impact(A) src.throwing = 0 if(isobj(A)) - if(A.density && !A.CanPass(src,target)) // **TODO: Better behaviour for windows - // which are dense, but shouldn't always stop movement + if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement src.throw_impact(A) src.throwing = 0 +//In some cases it's desirable to be able to throw stuff over dense objects. (Tables, racks) +/atom/var/throwpass = 0 //Thanks to SkyMarshal + /atom/proc/throw_impact(atom/hit_atom) if(istype(hit_atom,/mob/living)) var/mob/living/M = hit_atom diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index e3984feed8..145e939271 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -793,7 +793,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_if_possible(new /obj/item/clothing/gloves/combat(M), M.slot_gloves) M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(M), M.slot_ears) M.equip_if_possible(new /obj/item/clothing/glasses/thermal/eyepatch(M), M.slot_glasses) - M.equip_if_possible(new /obj/item/clothing/mask/cigarette/cigar/havanian(M), M.slot_wear_mask) + M.equip_if_possible(new /obj/item/clothing/mask/cigarette/cigar/havana(M), M.slot_wear_mask) M.equip_if_possible(new /obj/item/clothing/head/deathsquad/beret(M), M.slot_head) M.equip_if_possible(new /obj/item/weapon/gun/energy/pulse_rifle/M1911(M), M.slot_belt) M.equip_if_possible(new /obj/item/weapon/lighter/zippo(M), M.slot_r_store) diff --git a/code/modules/clothing/costume.dm b/code/modules/clothing/costume.dm index 539aa2af73..f59854cb23 100644 --- a/code/modules/clothing/costume.dm +++ b/code/modules/clothing/costume.dm @@ -27,7 +27,7 @@ /obj/effect/landmark/costume/elpresidente/New() new /obj/item/clothing/under/gimmick/rank/captain/suit(src.loc) new /obj/item/clothing/head/flatcap(src.loc) - new /obj/item/clothing/mask/cigarette/cigar/havanian(src.loc) + new /obj/item/clothing/mask/cigarette/cigar/havana(src.loc) new /obj/item/clothing/shoes/jackboots(src.loc) del(src) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index c190f64b6f..19c046bcb3 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -455,20 +455,20 @@ del(H) CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if (istype(mover,/obj/item)) + if (istype(mover,/obj/item) && mover.throwing) var/obj/item/I = mover - if(!mover.throwing) - return ..() + if(istype(I, /obj/item/weapon/dummy) || istype(I, /obj/item/projectile)) + return if(prob(75)) I.loc = src for(var/mob/M in viewers(src)) M.show_message("\the [I] lands in \the [src].", 3) else for(var/mob/M in viewers(src)) - M.show_message("\the [I] bounces off of \the [src]'s rim!", 3) + M.show_message("\the [I] bounces off of \the [src]'s rim!.", 3) return 0 else - return ..() + return ..(mover, target, height, air_group) //The toilet does not need to pressurized but can only handle small items. //You can also choke people by dunking them into the toilet. diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi index 634ce6957f..b24f0faef8 100644 Binary files a/icons/obj/cigarettes.dmi and b/icons/obj/cigarettes.dmi differ diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index bdb4019531..2f3b58b99a 100644 Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm index 100f931867..2c153af2ef 100755 --- a/maps/tgstation.2.0.8.dmm +++ b/maps/tgstation.2.0.8.dmm @@ -6214,7 +6214,7 @@ "cpz" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "cpA" = (/obj/machinery/door_control{id = "ERTIN"; pixel_y = 26},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "cpB" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) -"cpC" = (/obj/structure/table/woodentable{dir = 9},/obj/item/weapon/reagent_containers/food/drinks/flask,/obj/item/clothing/mask/cigarette/cigar/havanian,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) +"cpC" = (/obj/structure/table/woodentable{dir = 9},/obj/item/weapon/reagent_containers/food/drinks/flask,/obj/item/clothing/mask/cigarette/cigar/havana,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) "cpD" = (/obj/machinery/computer/security/telescreen{name = "Spec. Ops. Monitor"; network = "CREED"},/obj/structure/table/woodentable{dir = 5},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) "cpE" = (/obj/structure/table/woodentable{dir = 5},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed) "cpF" = (/obj/machinery/computer/card/centcom,/obj/item/weapon/card/id/centcom,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed)