/
githubmirror
/
vgstation13
Обзор
Документация
Войти
/
githubmirror
/
vgstation13
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
Bleeding-Edge
code/_onclick/other_mobs.dm
251 строка
7 KB
boy2mantwicethefam
Update other_mobs.dm (#33950)
03 янв 2023, 04:29
Не верифицирован
03 янв 2023, 04:29
939bcaf
Код
Авторство
О чём код?
/* Humans: Adds an exception for gloves, to allow special glove types like the ninja ones. Otherwise pretty standard. */ /mob/living/carbon/human/UnarmedAttack(var/atom/A, var/proximity, var/params) var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines if(a_intent == "hurt" && !is_pacified() && A.loc != src) if(handleSpecialAttack(A)) return // Special glove functions: // If the gloves do anything, have them return 1 to stop // normal attack_hand() here. if(proximity && istype(G) && G.Touch(A, src, 1)) return if(ismob(A)) delayNextAttack(10) if(!can_use_hand_or_stump()) to_chat(src, "<span class = 'notice'>You try to move your arm but nothing happens. Need a hand?</span>") return if(src.can_use_hand()) A.attack_hand(src, params, proximity) else A.attack_stump(src, params) if(proximity && isobj(A)) var/obj/O = A if(O.material_type) O.material_type.on_use(O, src, null) /mob/living/carbon/human/proc/handleSpecialAttack(var/atom/A) var/special_attack_result = SPECIAL_ATTACK_SUCCESS switch(attack_type) //Special attacks - kicks, bites if(ATTACK_KICK) if(can_kick(A)) delayNextAttack(10) special_attack_result = A.kick_act(src) if(special_attack_result != SPECIAL_ATTACK_CANCEL) //kick_act returns that value if there's no interaction specified after_special_attack(A, attack_type, special_attack_result) return TRUE delayNextAttack(-10) //This is only called when the kick fails else set_attack_type() //Reset attack type if(ATTACK_BITE) if(can_bite(A)) delayNextAttack(10) special_attack_result = A.bite_act(src) if(special_attack_result != SPECIAL_ATTACK_CANCEL) //bite_act returns that value if there's no interaction specified after_special_attack(A, attack_type, special_attack_result) return TRUE delayNextAttack(-10) //This is only called when the bite fails else set_attack_type() //Reset attack type return FALSE /atom/proc/attack_hand(mob/user as mob, params, var/proximity) INVOKE_EVENT(src, /event/attackhand, "user" = user, "target" = src) //called when we try to click but have no hand //good for general purposes /atom/proc/attack_stump(mob/user as mob, params, var/proximity) if(!requires_dexterity(user)) attack_hand(user, params, proximity) //if the object doesn't need dexterity, we can use our stump else to_chat(user, "Your [user.get_index_limb_name(user.active_hand)] is not fine enough for this action.") /atom/proc/requires_dexterity(mob/user) return 0 /mob/living/carbon/human/RangedAttack(var/atom/A) if(!gloves && !mutations.len) return if(gloves) var/obj/item/clothing/gloves/G = gloves if(istype(G) && G.Touch(A, src, 0)) // for magic gloves return if(mutations.len) if((M_LASER in mutations) && a_intent == I_HURT) LaserEyes(A) // moved into a proc below else if(M_TK in mutations) /*switch(get_dist(src,A)) if(1 to 5) // not adjacent may mean blocked by window Next_move += 2 if(5 to 7) Next_move += 5 if(8 to 15) Next_move += 10 if(16 to 128) return */ A.attack_tk(src) /* Animals & All Unspecified */ /mob/living/UnarmedAttack(var/atom/A) if(ismob(A)) delayNextAttack(10) A.attack_animal(src) return /atom/proc/attack_animal(mob/user as mob) return /* Monkeys */ /mob/living/carbon/monkey/UnarmedAttack(var/atom/A) if(ismob(A)) delayNextAttack(10) A.attack_paw(src) return /atom/proc/attack_paw(mob/user as mob) return /* Monkey RestrainedClickOn() was apparently the one and only use of all of the restrained click code (except to stop you from doing things while handcuffed); moving it here instead of various hand_p's has simplified things considerably */ /mob/living/carbon/monkey/RestrainedClickOn(var/atom/A) ..() if(a_intent != I_HURT || !ismob(A)) return delayNextAttack(10) if(istype(wear_mask, /obj/item/clothing/mask/muzzle)) return var/mob/living/carbon/ML = A var/dam_zone = ran_zone(pick(LIMB_CHEST, LIMB_LEFT_HAND, LIMB_RIGHT_HAND, LIMB_LEFT_LEG, LIMB_RIGHT_LEG)) var/armor = ML.run_armor_check(dam_zone, "melee") if(prob(75)) ML.apply_damage(rand(1,3), BRUTE, dam_zone, armor) for(var/mob/O in viewers(ML, null)) O.show_message("<span class='danger'>[name] has bit [ML]!</span>", 1) if(armor >= 100) return if(ismonkey(ML)) for(var/datum/disease/D in viruses) if(istype(D, /datum/disease/jungle_fever)) ML.contract_disease(D,1,0) else for(var/mob/O in viewers(ML, null)) O.show_message("<span class='danger'>[src] has attempted to bite [ML]!</span>", 1) //Humans being able to bite and kick while restrained, either generally or only when not being pulled or grabbed, according to config.human_captive_kickbite. /mob/living/carbon/human/RestrainedClickOn(var/atom/A) ..() if(a_intent != I_HURT || !attack_type || A.loc == src || !Adjacent(A)) return if(is_pacified()) to_chat(src, "<span class = 'notice'>Violence is not the answer, you remind yourself.</span>") return if(!config.human_captive_kickbite) if(pulledby || grabbed_by.len || locked_to) var/restrained_message = "<span class = 'notice'>You're [locked_to ? "buckled to [locked_to]" : "being restrained"]!" switch(attack_type) if(ATTACK_KICK) restrained_message += " Need a leg up?" if(ATTACK_BITE) restrained_message += " Bitten off more than you can chew?" restrained_message += "</span>" to_chat(src, restrained_message) return handleSpecialAttack(A) /* Aliens Defaults to same as monkey in most places */ /mob/living/carbon/alien/UnarmedAttack(var/atom/A) if(ismob(A)) delayNextAttack(10) A.attack_alien(src) return /atom/proc/attack_alien(mob/user as mob) attack_paw(user) return /mob/living/carbon/alien/RestrainedClickOn(var/atom/A) return // Babby aliens /mob/living/carbon/alien/larva/UnarmedAttack(var/atom/A) if(ismob(A)) delayNextAttack(10) A.attack_larva(src) return /atom/proc/attack_larva(mob/user as mob) return /* Slimes Nothing happening here */ /mob/living/carbon/slime/UnarmedAttack(var/atom/A) A.attack_slime(src) return /atom/proc/attack_slime(mob/user as mob) return /mob/living/carbon/slime/RestrainedClickOn(var/atom/A) return /* New Players: Have no reason to click on anything at all. */ /mob/new_player/ClickOn() return /* Constructs */ /mob/living/simple_animal/construct/UnarmedAttack(atom/A) if(ismob(A)) delayNextAttack(10) if(!A.attack_construct(src))//does attack_construct do something to that atom? if no, just do attack_animal A.attack_animal(src) /mob/living/simple_animal/construct/RangedAttack(atom/A) A.attack_construct(src) /atom/proc/attack_construct(mob/user as mob,var/dist = null) return 0 //Martians /mob/living/carbon/complex/martian/UnarmedAttack(atom/A) if(ismob(A)) delayNextAttack(10) A.attack_martian(src) /mob/living/carbon/complex/martian/RangedAttack(atom/A) if(mutations.len) if((M_LASER in mutations) && a_intent == I_HURT) LaserEyes(A) // moved into a proc below else if(M_TK in mutations) A.attack_tk(src) /atom/proc/attack_martian(mob/user) return attack_hand(user)