Blitz NPC AI - Printable Version +- SphereCommunity (https://forum.spherecommunity.net) +-- Forum: Sphere 0.56d (/Forum-Sphere-0-56d) +--- Forum: Script Help (/Forum-Script-Help) +--- Thread: Blitz NPC AI (/Thread-Blitz-NPC-AI) |
Blitz NPC AI - Lestatnine - 12-30-2019 05:46 AM I really like the idea of this script where you can in effect have a populated shard without having "real" players playing just npc's. In the directions it suggests you have to define your maps in order for it to run correctly. [comment installation] "You will need to add e_npcai_players to eventsplayer and e_npcai to eventspet in sphere.ini in order for this script to work properly. " I got the above done. "When first loading this script be sure to set npcai_maps and: use .enable_npcai once to enable all NPCs with this AI script or use .enable_npcai <map#> to enable all NPCs on <map#> with this AI script" This part is not computing. If someone installed this script can you explain exactly how it is done. How do you set the maps..what maps? World maps? "When first loading this script be sure to set npcai_maps" Thx RE: Blitz NPC AI - Lestatnine - 12-31-2019 02:48 AM I finally got this working, you have to use one map at a time. But i have concluded since a vendor is saying "I am wandering now" and then "I am working now." they are not going to utilize the the scripts ability because they are tried to their spawn points. So what has to happen is maybe you have to just create and not spawn some npcs and then they will do things, or maybe just spawn some guys but make their radius very large. RE: Blitz NPC AI - Coruja - 01-13-2020 10:15 AM This seems to be a custom script, so maybe if you post the script ppl will be able to help you better RE: Blitz NPC AI - Lestatnine - 01-16-2020 03:01 AM In order to get it into shape so it can be edited to make it so an Admin can create an npc and that npc will go into the world with no limits relative to radius and can basically act just like a actual player character is to figure out what this script does and then tweak it... so here it is. Its pretty big but the functions are pretty big so not too many actual functions. VERSION=0.56b [comment installation] You will need to add e_npcai_players to eventsplayer and e_npcai to eventspet in sphere.ini in order for this script to work properly. When first loading this script be sure to set npcai_maps and: use .enable_npcai once to enable all NPCs with this AI script or use .enable_npcai <map#> to enable all NPCs on <map#> with this AI script Enjoy. [plevel 6] enable_npcai [defname npcai] npcai_maps 5 //Total amount of maps your server uses. npcai_can_eatfood_pack 1 //Do NPCs eat food out of pack? npcai_can_eatfood_corpse 1 //Do NPCs eat corpses? npcai_can_eatfood_hunt 1 //Do NPCs hunt and kill for food? npcai_can_eatfood_eggs 1 //Do NPCs eat eggs? npcai_can_eatfood_changecolor 1 //Do NPCs change colors if they eat? npcai_can_poo_rat 1 //Do Rats 'poo'? npcai_can_poo_horse 1 //Do Horses 'poo'? npcai_can_poo_effect 1 //Do Rat 'poos' have a spelleffect? (Defined below) npcai_can_mine 1 //Do NPCs mine ore? npcai_can_chop 1 //Do NPCs chop wood? npcai_can_chop_kindling 1 //Do NPCs chop kindling? npcai_can_fish 1 //Do NPCs fish? npcai_can_lay_eggs_alligators 1 //Do Alligators lay eggs? npcai_can_lay_eggs_birds 1 //Do Birds lay eggs? npcai_can_lay_eggs_chickens 1 //Do Chickens lay eggs? npcai_can_lay_eggs_snakes 1 //Do Snakes lay eggs? npcai_can_step_eggs 1 //Do eggs get crushed when stepped on? npcai_can_throw_rock 1 //Do NPCs throw rocks? npcai_can_throw_rock_need 1 //Do NPCs need a rock in their pack? npcai_can_breath_fire 1 //Do NPCs breath fire? npcai_id_eatfood_changecolor t_ore, t_ingot, t_log, t_board //NPCs will change colors to these item ids and types when eaten. npcai_id_poo_rat i_horse_dung //ID of 'poo' for Rats npcai_id_poo_horse i_horse_dung //ID of 'poo' for Horses npcai_id_kindling i_kindling //ID of the kindling NPCs chop npcai_id_rock i_rock_plain //ID of Rock(s) thrown by Cyclops, Ettins, Ogres, Titans, Trolls npcai_id_breath i_fire_column //ID of fire breathed by NPCs npcai_id_breath_explosion i_fx_explode //ID of explosion breathed by NPCs npcai_id_eggs i_eggs_fresh //ID of freshly laid eggs npcai_id_eggs_stepped i_eggshells //ID of stepped on eggs npcai_resource_ore mr_nothing, mr_rusty, mr_iron, mr_copper //Region Resource ID(s) for NPCs that mine ore npcai_resource_chop mr_nothing, mr_tree //Region Resource ID(s) for NPCs that chop wood npcai_resource_fish mr_nothing, mr_fish1, mr_fish2, mr_fish3, mr_fish4 //Region Resource ID(s) for NPCs that fish fish npcai_snd_eat {03a 03c} //SFX for eating food, corpses, eggs npcai_snd_fish {025 026} //SFX for fishing fish npcai_snd_chop {0147 0148} //SFX for chopping a tree npcai_snd_mine {0125 0126} //SFX for mining ore npcai_snd_eggs_stepped {01c2 01c6} //SFX of stepping on eggs npcai_poo_effect s_poison //Spelleffect of poisonous Rat 'poo' npcai_poo_effect_strength 10.0 //Strength of the spelleffect of poisonous Rat 'poo' npcai_dam_rock {10 15} //Damage received when being hit by a rock npcai_dam_breath {45 50} //Damage received when being hit by dragon's breath npcai_timer_delay {1 360} //Delay in seconds between 'checks' for NPCs to do 'things' - larger the range in value the less CPU this script will use, lower the value and NPCs will do 'things' more often, default: {1 360} - Use cautiously npcai_timer_fish {15 30} //Time between the use of fishing by NPCs npcai_timer_chop {15 30} //Time between the use of lumberjacking by NPCs npcai_timer_mine {15 30} //Time between the use of mining by NPCs npcai_timer_eatfood_decay 10 //Time until food drops by 1 in value npcai_timer_eatfood_hungry {600 660} //Time between eating food if NPC is hungry npcai_timer_eatfood_hungrier {330 360} //Time between eating food if NPC is very hungry npcai_timer_eatfood_hungriest {180 210} //Time between eating food if NPC is extremely hungry npcai_timer_eatfood_replenish 30 //Time until an NPC replenishes it's foodtypes after becoming full npcai_timer_poo_rat {1200 1800} //Time between each Rat 'poo' npcai_timer_poo_horse {900 1200} //Time between each Horse 'poo' npcai_timer_lay_eggs {450 600} //Time between eggs laid by NPCs npcai_timer_throw_rock {15 30} //Time between each rock thrown by an NPC [function enable_npcai] if (<dargn2>==1) if (<ischar>) if (<isplayer>) if !(<isevent.e_npcai_players>) events +e_npcai_players endif else if !(<tag0.npcai>) npcai endif endif endif elseif (<dargn2>==2) forchars 9999 enable_npcai 0, 1 endfor region.allcharsidle enable_npcai 0, 1 else local.p=<p> local.maxlooptimes=<serv.maxlooptimes> local.freezerestarttime=<serv.freezerestarttime> serv.maxlooptimes=0 serv.freezerestarttime=0fffffff local.p=<p> if !(<argn1>) for map 0 <def0.npcai_maps> p=<serv.map(1,1,0,<dlocal.map>).region.name> enable_npcai 0, 2 endwhile else p=<serv.map(1,1,0,<dargn1>).region.name> enable_npcai 0, 2 endif serv.maxlooptimes=<local.maxlooptimes> serv.freezerestarttime=<local.freezerestarttime> p=<local.p> endif [function npcai] if (<ischar>) if !(<isplayer>) if (<p.x> > 0) && (<p.y> > 0) tag.npcai=1 if !(strmatch(*e_npcai*,<serv.eventspet>) if !(<isevent.e_npcai>) events +e_npcai endif endif if !( <flags> & statf_invul ) && !( <flags> & statf_freeze ) && !( <flags> & statf_invisible ) && !( <flags> & statf_sleeping ) && !( <flags> & statf_insubstantial ) && !( <flags> & statf_stone ) && !( <flags> & statf_hidden ) && !( <flags> & statf_ridden ) if !(<tag0.ate>) if (<food> < 15) if (<def0.npcai_can_eatfood_pack>) npcai_eatfoodtype <npc> endif if (<def0.npcai_can_eatfood_corpse>) npcai_eatcorpse <body> endif if (<def0.npcai_can_eatfood_hunt>) npcai_huntforfood <body> endif if (<body>==c_alligator) || (<body>==c_snake) || (<body>==c_snake_giant) if (<def0.npcai_can_eatfood_eggs>) npcai_eateggs <body> endif endif endif endif if (<food> > 0) if (<dargn1> >= <eval <qval <isempty <def.npcai_timer_eatfood_decay>> ?<serv.gameminutelength>:<def0.npcai_timer_eatfood_decay>>>) food -= 1 argn1=0 endif else argn1=0 endif if (<npc>==brain_animal) if (<body>==c_bear_grizzly) || (<body>==c_bear_polar) || (<body>==c_bear_brown) if (<food> < 10) if !(<notogetflag <uid>>==6) tag.old_karma=k:<karma> karma=-2999 endif else if (<notogetflag <uid>>==6) if !(<isempty <tag.old_karma>>) karma=<strsub 2 0 <tag0.old_karma>> tag.old_karma= else karma=-799 endif endif endif if !(<tag0.usingskill>) if (<def0.npcai_can_fish>) npcai_fish endif endif elseif (<body>==c_alligator) if (<def0.npcai_can_lay_eggs_alligators>) if !(<tag0.actioninuse>) npcai_lay_eggs <body> endif endif elseif (<body>==c_bird) || (<body>==c_eagle) if (<def0.npcai_can_lay_eggs_birds>) if !(<tag0.actioninuse>) npcai_lay_eggs <body> endif endif elseif (<body>==c_chicken) if (<def0.npcai_can_lay_eggs_chickens>) if !(<tag0.actioninuse>) npcai_lay_eggs <body> endif endif elseif (<body>==c_snake) || (<body>==c_snake_giant) if (<def0.npcai_can_lay_eggs_snakes>) if !(<tag0.actioninuse>) npcai_lay_eggs <body> endif endif elseif (<body>==c_rat) || (<body>==c_rat_giant) if (<def0.npcai_can_poo_rat>) if !(<tag0.actioninuse>) npcai_poo <body> endif endif elseif (<body>==c_horse_brown_lt) || (<body>==c_horse_brown_dk) || (<body>==c_horse_tan) || (<body>==c_horse_gray) if (<def0.npcai_can_poo_horse>) if !(<tag0.actioninuse>) npcai_poo <body> endif endif endif elseif (<npc>==brain_vendor) || (<npc>==brain_human) if (<def0.npcai_can_mine>) if !(<tag0.usingskill>) if (<findtype.t_weapon_mace_pick>) npcai_mine endif endif endif if (<def0.npcai_can_chop>) if !(<tag0.usingskill>) if (<findtype.t_weapon_sword>) npcai_chop endif endif endif if (<def0.npcai_can_chop_kindling>) if !(<tag0.usingskill>) if (<findtype.t_weapon_fence>) npcai_chop_kindling endif endif endif if (<def0.npcai_can_fish>) if !(<tag0.usingskill>) if (<findtype.t_fish_pole>) npcai_fish endif endif endif endif endif timerf <eval <qval <isempty <def.npcai_timer_delay>> ?{1 360}:<def0.npcai_timer_delay>>>, npcai <eval <argn1> +1> endif endif endif [function npcai_fish] for x -3 3 for y -3 3 if (<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics>) local.isplatform= for s 0 <eval <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics> +-1> if !(<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.type>==t_water) if (<eval <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.z> +15> >= <z>) && (<eval <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.z> +-15> <= <z>) if ( <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.can> & can_i_platform ) local.isplatform=1 endif endif endif endfor if (<local.isplatform>) for s 0 <eval <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics> +-1> if (<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.type>==t_water) local.water += 1 local.water_p<dlocal.water>=<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.z>,<map> endif endfor endif endif if (<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).type>==t_water) local.water += 1 local.water_p<dlocal.water>=<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).terrain.z>,<map> endif endfor endfor if (<local.water>) local.water=<eval {1 <local.water>}> local.water_p=<local.water_p<dlocal.water>> local.resource=<npcai_getresource t_water, <local.water_p>> if !(<local.resource>) serv.newitem=i_worldgem_bit new.type=t_water new.attr=attr_move_never|attr_invis|attr_decay new.p=<local.water_p> local.resource=<new.uid> endif if !(<isempty <def.npcai_resource_fish>>) local.resourceid=<def0.npcai_resource_fish> while !(strmatch(<local.resourceid>,0)) local.x += 1 local.id.<dlocal.x>=<strarg <local.resourceid>> local.resourceid=<streat <local.resourceid>> endwhile local.x=<eval {1 <local.x>}> endif if (<serv.regionresource.<local.id.<dlocal.x>>>) uid.<local.resource>.more1=<local.id.<dlocal.x>> else dorand 5 uid.<local.resource>.more1=mr_nothing uid.<local.resource>.more1=mr_fish1 uid.<local.resource>.more1=mr_fish2 uid.<local.resource>.more1=mr_fish3 uid.<local.resource>.more1=mr_fish4 enddo endif uid.<local.resource>.timer=<eval {<serv.regionresource.<uid.<local.resource>.more1>.regen>}> act=<local.resource> for t 0 <eval <eval <serv.skill.skill_fishing.delay> /10> +1> timerf <dlocal.t>, sound=<eval {025 026}> timerf <dlocal.t>, bow timerf <dlocal.t>, face=<act.uid> endfor emote splashes around the shoreline timerf <eval <eval <serv.skill.skill_fishing.delay> /10> +1>, trigger @npcai_skillsuccess,1,<eval <def0.skill_fishing> & ~0c0000000>, <act.uid> tag.usingskill=1 endif [function npcai_mine] for x -3 3 for y -3 3 if (<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics>) for s 0 <eval <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics> +-1> if (<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.type>==t_rock) if (<eval <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.z> +5> >= <z>) && (<eval <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.z> +-5> <= <z>) local.rock += 1 local.rock_p<dlocal.rock>=<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.z>,<map> endif endif endfor endif endfor endfor if !(<local.rock>) for x -3 3 for y -3 3 if (<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).type>==t_rock) if (<eval <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).terrain.z> +5> >= <z>) && (<eval <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).terrain.z> +-5> <= <z>) local.rock += 1 local.rock_p<dlocal.rock>=<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).terrain.z>,<map> endif endif endfor endfor endif if (<local.rock>) local.rock=<eval {1 <local.rock>}> local.rock_p=<local.rock_p<dlocal.rock>> local.resource=<npcai_getresource t_rock, <local.rock_p>> if !(<local.resource>) serv.newitem=i_worldgem_bit new.type=t_rock new.attr=attr_move_never|attr_invis|attr_decay new.p=<local.rock_p> local.resource=<new.uid> endif if !(<isempty <def.npcai_resource_mine>>) local.resourceid=<def0.npcai_resource_mine> while !(strmatch(<local.resourceid>,0)) local.x += 1 local.id.<dlocal.x>=<strarg <local.resourceid>> local.resourceid=<streat <local.resourceid>> endwhile local.x=<eval {1 <local.x>}> endif if (<serv.regionresource.<local.id.<dlocal.x>>>) uid.<local.resource>.more1=<local.id.<dlocal.x>> else dorand 4 uid.<local.resource>.more1=mr_nothing uid.<local.resource>.more1=mr_rusty uid.<local.resource>.more1=mr_iron uid.<local.resource>.more1=mr_copper enddo endif uid.<local.resource>.timer=<eval {<serv.regionresource.<uid.<local.resource>.more1>.regen>}> act=<local.resource> for t 0 <eval <eval <eval <serv.skill.skill_mining.delay> /10> +1> *3> timerf <dlocal.t>, sound=<eval {0125 0126}> timerf <dlocal.t>, anim 9 timerf <dlocal.t>, face=<act.uid> endfor emote dig the earth for ore timerf <eval <eval <eval <serv.skill.skill_mining.delay> /10> +1> *3>, trigger @npcai_skillsuccess,1,<eval <def0.skill_mining> & ~0c0000000>, <act.uid> tag.usingskill=1 endif [function npcai_chop] if (<isneartype t_tree 1>) local.dist=1 elseif (<isneartype t_tree 2>) local.dist=2 else local.dist=3 endif for x -<dlocal.dist> <local.dist> for y -<dlocal.dist> <local.dist> if (<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics>) for s 0 <eval <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics> +-1> if (<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.type>==t_tree) if (<eval <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.z> +5> >= <z>) && (<eval <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.z> +-5> <= <z>) local.tree += 1 local.tree_p<dlocal.tree>=<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.z>,<map> endif endif endfor endif endfor endfor if (<local.tree>) local.tree=<eval {1 <local.tree>}> local.tree_p=<local.tree_p<dlocal.tree>> local.resource=<npcai_getresource t_tree, <local.tree_p>> if !(<local.resource>) serv.newitem=i_worldgem_bit new.type=t_tree new.attr=attr_move_never|attr_invis|attr_decay new.p=<local.tree_p> local.resource=<new.uid> endif if !(<isempty <def.npcai_resource_chop>>) local.resourceid=<def0.npcai_resource_chop> while !(strmatch(<local.resourceid>,0)) local.x += 1 local.id.<dlocal.x>=<strarg <local.resourceid>> local.resourceid=<streat <local.resourceid>> endwhile local.x=<eval {1 <local.x>}> endif if (<serv.regionresource.<local.id.<dlocal.x>>>) uid.<local.resource>.more1=<local.id.<dlocal.x>> else dorand 2 uid.<local.resource>.more1=mr_nothing uid.<local.resource>.more1=mr_tree enddo endif uid.<local.resource>.timer=<eval {<serv.regionresource.<uid.<local.resource>.more1>.regen>}> act=<local.resource> for t 0 <eval <eval <eval <serv.skill.skill_lumberjack.delay> /10> +1> *4> timerf <dlocal.t>, sound=<eval {0147 0148}> timerf <dlocal.t>, anim 9 timerf <dlocal.t>, face=<act.uid> endfor emote chop a tree timerf <eval <eval <eval <serv.skill.skill_lumberjack.delay> /10> +1> *4>, trigger @npcai_skillsuccess,1,<eval <def0.skill_lumberjack> & ~0c0000000>, <act.uid> tag.usingskill=1 endif [function npcai_chop_kindling] for x -3 3 for y -3 3 if (<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics>) for s 0 <eval <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics> +-1> if (<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.type>==t_tree) if (<eval <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.z> +5> >= <z>) && (<eval <serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.z> +-5> <= <z>) local.tree += 1 local.tree_p<dlocal.tree>=<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,<serv.map(<eval <p.x> +<local.x>>,<eval <p.y> +<local.y>>,0,<map>).statics.<local.s>.z>,<map> endif endif endfor endif endfor endfor if (<local.tree>) local.tree=<eval {1 <local.tree>}> local.tree_p=<local.tree_p<dlocal.tree>> local.resource=<npcai_getresource t_tree, <local.tree_p>> if !(<local.resource>) serv.newitem=i_worldgem_bit new.type=t_tree new.attr=attr_move_never|attr_invis|attr_decay new.p=<local.tree_p> local.resource=<new.uid> endif if !(<isempty <def.npcai_resource_chop>>) local.resourceid=<def0.npcai_resource_chop> while !(strmatch(<local.resourceid>,0)) local.x += 1 local.id.<dlocal.x>=<strarg <local.resourceid>> local.resourceid=<streat <local.resourceid>> endwhile local.x=<eval {1 <local.x>}> uid.<local.resource>.more1=<local.id.<dlocal.x>> else dorand 2 uid.<local.resource>.more1=mr_nothing uid.<local.resource>.more1=mr_tree enddo endif uid.<local.resource>.timer=<eval {<serv.regionresource.<uid.<local.resource>.more1>.regen>}> act=<local.resource> for t 0 <eval <eval <eval <serv.skill.skill_lumberjack.delay> /10> +1> *4> timerf <dlocal.t>, sound=<eval {0147 0148}> timerf <dlocal.t>, anim 9 timerf <dlocal.t>, face=<act.uid> endfor emote chop a tree for kindling timerf <eval <eval <eval <serv.skill.skill_lumberjack.delay> /10> +1> *4>, trigger @npcai_skillsuccess,1,<eval <def0.skill_lumberjack> & ~0c0000000>, <act.uid>, 1 tag.usingskill=1 endif [function npcai_getresource] local.p=<p> p=<streat <args>> foritems 0 if (<baseid>==i_worldgem_bit) if (<type>==<strarg <args>>) local.resource=<uid> endif endif endfor p=<local.p> return <local.resource> [function npcai_eatfoodtype] local.foodtype=<foodtype> if (<argn1>==<def0.brain_banker>) || (<argn1>==<def0.brain_vendor>) || (<argn1>==<def0.brain_guard>) || (<argn1>==<def0.brain_human>) while !(<isempty <strarg <streat <local.foodtype>>>>) if !(<local.ate>) if (<findlayer.21>) if (<serv.typedef.<strarg <streat <local.foodtype>>>>) if (<findlayer.21.findtype.<strarg <streat <local.foodtype>>>>) emote eat a <findlayer.21.findtype.<strarg <streat <local.foodtype>>>.name> if (<eval <findlayer.21.findtype.<strarg <streat <local.foodtype>>>.amount> +-1> < 1) findlayer.21.findtype.<strarg <streat <local.foodtype>>>.remove else findlayer.21.findtype.<strarg <streat <local.foodtype>>>.amount=<findlayer.21.findtype.<strarg <streat <local.foodtype>>>.amount> +-1 findlayer.21.findtype.<strarg <streat <local.foodtype>>>.update endif if (<def0.npcai_can_eatfood_changecolor>) local.changecolortypes=<def0.npcai_types_eatfood_changecolor> while !(strmatch(<local.changecolortypes>,0)) if !(<local.atecolor>) if (strmatch(<strarg <streat <local.foodtype>>>,<strarg <local.changecolortypes>>) local.atecolor=<findlayer.21.findtype.<strarg <streat <local.foodtype>>>.color> endif endif local.changecolortypes=<streat <local.changecolortypes>> endwhile endif local.ate=1 endif elseif (<serv.itemdef.<strarg <streat <local.foodtype>>>>) if (<findlayer.21.findid.<strarg <streat <local.foodtype>>>>) emote eat a <findlayer.21.findid.<strarg <streat <local.foodtype>>>.name> if (<eval <findlayer.21.findid.<strarg <streat <local.foodtype>>>.amount> +-1> < 1) findlayer.21.findid.<strarg <streat <local.foodtype>>>.remove else findlayer.21.findid.<strarg <streat <local.foodtype>>>.amount=<findlayer.21.findid.<strarg <streat <local.foodtype>>>.amount> +-1 findlayer.21.findid.<strarg <streat <local.foodtype>>>.update endif if (<def0.npcai_can_eatfood_changecolor>) local.changecolortypes=<def0.npcai_types_eatfood_changecolor> while !(strmatch(<local.changecolortypes>,0)) if !(<local.atecolor>) if (<findlayer.21.findid.<strarg <streat <local.foodtype>>>.type>==<strarg <local.changecolortypes>>) local.atecolor=<findlayer.21.findid.<strarg <streat <local.foodtype>>>.color> endif endif local.changecolortypes=<streat <local.changecolortypes>> endwhile endif local.ate=1 endif endif endif endif if (<def0.<strarg <streat <local.foodtype>>>>==<def0.t_food>) || (<def0.<strarg <streat <local.foodtype>>>>==<def0.t_fruit>) || (<serv.itemdef.<strarg <streat <local.foodtype>>>.type>==t_food) || (<serv.itemdef.<strarg <streat <local.foodtype>>>.type>==t_fruit) local.replenishable=1 endif local.foodtype=<streat <streat <local.foodtype>>> endwhile endif local.uid=<uid> if !(<local.ate>) foritems 3 if !(<local.ate>) if (<uid.<local.uid>.canseelos <uid>>) local.foodtype=<uid.<local.uid>.foodtype> while !(<isempty <strarg <streat <local.foodtype>>>>) if (<serv.typedef.<strarg <streat <local.foodtype>>>>) if (<type>==<strarg <streat <local.foodtype>>>) if (<type>==t_fish) serv.newitem=i_fish_raw_whole new.color=<color> trysrc <local.uid> new.drop elseif (<dispid>==i_eggs_fresh) serv.newitem=i_eggshells new.color=<color> trysrc <local.uid> new.drop sound=<eval {01c3 01c6}> endif uid.<local.uid>.emote eat a <name> amount=<amount> +-1 if (<amount> < 1) remove else update endif if (<def0.npcai_can_eatfood_changecolor>) local.changecolortypes=<def0.npcai_types_eatfood_changecolor> while !(strmatch(<local.changecolortypes>,0)) if !(<local.atecolor>) if (<type>==<strarg <local.changecolortypes>>) local.atecolor=<color> endif endif local.changecolortypes=<streat <local.changecolortypes>> endwhile endif local.ate=1 endif elseif (<serv.itemdef.<strarg <streat <local.foodtype>>>>) if (<baseid>==<strarg <streat <local.foodtype>>>) if (<type>==t_fish) serv.newitem=i_fish_raw_whole new.color=<color> trysrc <local.uid> new.drop elseif (<dispid>==i_eggs_fresh) serv.newitem=i_eggshells new.color=<color> trysrc <local.uid> new.drop sound=<eval {01c3 01c6}> endif uid.<local.uid>.emote eat a <name> amount=<amount> +-1 if (<amount> < 1) remove else update endif if (<def0.npcai_can_eatfood_changecolor>) local.changecolortypes=<def0.npcai_types_eatfood_changecolor> while !(strmatch(<local.changecolortypes>,0)) if !(<local.atecolor>) if (<baseid>==<strarg <local.changecolortypes>>) local.atecolor=<findlayer.21.findid.<strarg <streat <local.foodtype>>>.color> endif endif local.changecolortypes=<streat <local.changecolortypes>> endwhile endif local.ate=1 endif endif if (<local.ate>) local.foodtype= else local.foodtype=<streat <streat <local.foodtype>>> endif endwhile endif endif endfor endif if (<local.ate>) salute sound=<eval <qval <isempty <def.npcai_snd_eat>> ?{03a 03c}:<def0.npcai_snd_eat>>> food += 1 tag.ate=1 if (<food> < 5) timerf <eval <qval <isempty <def.npcai_timer_eatfood_hungriest>> ?{5 15}:<def0.npcai_timer_eatfood_hungriest>>>, tag.ate= elseif (<food> < 10) timerf <eval <qval <isempty <def.npcai_timer_eatfood_hungrier>> ?{30 60}:<def0.npcai_timer_eatfood_hungrier>>>, tag.ate= elseif (<food> < 15) timerf <eval <qval <isempty <def.npcai_timer_eatfood_hungry>> ?{90 120}:<def0.npcai_timer_eatfood_hungry>>>, tag.ate= else timerf <eval <qval <isempty <def.npcai_timer_eatfood_replenish>> ?{180 210}:<def0.npcai_timer_eatfood_replenish>>>, npcai_replenishfoodtype endif else if (<local.replenishable>) npcai_replenishfoodtype endif endif [function npcai_replenishfoodtype] if (<ischar>) for <eval {3 5}> if (<maxweight> > <weight>) serv.newitem=random_food if (<maxweight> > <eval <weight> +<new.weight>>) trysrc <uid> new.bounce else new.remove endif endif endfor endif [function npcai_eatcorpse] if (<serv.chardef.<argv[0]>.baseid>==c_bear_grizzly) || (<serv.chardef.<argv[0]>.baseid>==c_bear_polar) || (<serv.chardef.<argv[0]>.baseid>==c_bear_brown) || (<serv.chardef.<argv[0]>.baseid>==c_wolf) || (<serv.chardef.<argv[0]>.baseid>==c_snake_giant) || (<serv.chardef.<argv[0]>.baseid>==c_spider_giant) || (<serv.chardef.<argv[0]>.baseid>==c_toad_giant) local.uid=<uid> foritems 3 if !(<local.corpse>) if (<type>==t_corpse) if (<uid.<local.uid>.canseelos <uid>>) if (<tag0.npc>==<def0.brain_human>) || (<tag0.npc>==<def0.brain_vendor>) || (<tag0.npc>==<def0.brain_banker>) || (<tag0.npc>==<def0.brain_guard>) || (<tag0.npc>==<def0.brain_animal>) || (<tag0.npc>==<def0.brain_monster>) || (<tag0.npc>==<def0.brain_dragon>) || (<link.isplayer>) if !(<tag0.waseaten>) local.corpse=<uid> endif endif endif endif endif endfor if (<local.corpse>) face=<local.corpse> goto <uid.<local.corpse>.p> uid.<local.corpse>.tag.waseaten=1 serv.newitem=i_blood_pool_large new.color=<serv.chardef.<uid.<local.corpse>.tag0.baseid>.bloodcolor> new.attr=attr_move_never|attr_decay new.p=<uid.<local.corpse>.p> new.timer=<eval <serv.decaytimer> *60> bow emote eat some <uid.<local.corpse>.name> sound=<eval <qval <isempty <def.npcai_snd_eat>> ?{03a 03c}:<def0.npcai_snd_eat>>> food += 1 tag.ate=1 if (<food> < 5) timerf <eval <qval <isempty <def.npcai_timer_eatfood_hungriest>> ?{5 15}:<def0.npcai_timer_eatfood_hungriest>>>, tag.ate= elseif (<food> < 10) timerf <eval <qval <isempty <def.npcai_timer_eatfood_hungrier>> ?{30 60}:<def0.npcai_timer_eatfood_hungrier>>>, tag.ate= elseif (<food> < 15) timerf <eval <qval <isempty <def.npcai_timer_eatfood_hungry>> ?{90 120}:<def0.npcai_timer_eatfood_hungry>>>, tag.ate= else timerf <eval <qval <isempty <def.npcai_timer_eatfood_replenish>> ?{180 210}:<def0.npcai_timer_eatfood_replenish>>>, npcai_replenishfoodtype endif endif endif [function npcai_eateggs] if (<serv.chardef.<argv[0]>.baseid>==c_alligator) || (<serv.chardef.<argv[0]>.baseid>==c_snake) || (<serv.chardef.<argv[0]>.baseid>==c_snake_giant) local.uid=<uid> foritems 3 if !(<local.ate>) if (<uid.<local.uid>.canseelos <uid>>) if (<baseid>==<qval <isempty <def.npcai_id_eggs>> ?i_eggs_fresh:<def0.npcai_id_eggs>>) local.ate=<uid> endif endif endif endfor if (<local.ate>) face=<local.ate> goto <uid.<local.ate>.uid> bow emote eat <uid.<local.ate>.name> if (<uid.<local.ate>.amount> > 1) uid.<local.ate>.amount -= 1 uid.<local.ate>.update else uid.<local.ate>.remove endif sound=<eval <qval <isempty <def.npcai_snd_eat>> ?{03a 03c}:<def0.npcai_snd_eat>>> food += 1 tag.ate=1 if (<food> < 5) timerf <eval <qval <isempty <def.npcai_timer_eatfood_hungriest>> ?{5 15}:<def0.npcai_timer_eatfood_hungriest>>>, tag.ate= elseif (<food> < 10) timerf <eval <qval <isempty <def.npcai_timer_eatfood_hungrier>> ?{30 60}:<def0.npcai_timer_eatfood_hungrier>>>, tag.ate= elseif (<food> < 15) timerf <eval <qval <isempty <def.npcai_timer_eatfood_hungry>> ?{90 120}:<def0.npcai_timer_eatfood_hungry>>>, tag.ate= else timerf <eval <qval <isempty <def.npcai_timer_eatfood_replenish>> ?{180 210}:<def0.npcai_timer_eatfood_replenish>>>, npcai_replenishfoodtype endif endif endif [function npcai_huntforfood] if !(<tag0.isattacking>) if (<serv.chardef.<argv[0]>.baseid>==c_bear_grizzly) || (<serv.chardef.<argv[0]>.baseid>==c_bear_polar) || (<serv.chardef.<argv[0]>.baseid>==c_bear_brown) local.uid=<uid> forchars <serv.distancetalk> if !(<local.attack>) if !(<uid>==<local.uid>) if (<notogetflag <uid>>==3) if (<str> < <uid.<local.uid>.str>) if !(<body>==c_bear_grizzly) && !(<body>==c_bear_polar) && !(<body>==c_bear_brown) if !( <flags> & statf_invul ) && !( <flags> & statf_freeze ) && !( <flags> & statf_invisible ) && !( <flags> & statf_sleeping ) && !( <flags> & statf_insubstantial ) && !( <flags> & statf_stone ) && !( <flags> & statf_hidden ) && !( <flags> & statf_ridden ) local.attack=<uid> endif endif endif endif endif endif endfor if (<local.attack>) emote growl bark 2 tag.isattacking=<local.attack> attack=<local.attack> uid.<local.attack>.tag.isattackedby=<uid> endif elseif (<serv.chardef.<argv[0]>.baseid>==c_wolf) forchars <serv.distancetalk> if !(<local.attack>) if !(<uid>==<local.uid>) if (<notogetflag <uid>>==3) if (<str> < <uid.<local.uid>.str>) if !(<body>==c_wolf) if !( <flags> & statf-invul ) && !( <flags> & statf_freeze ) && !( <flags> & statf_invisible ) && !( <flags> & statf_sleeping ) && !( <flags> & statf_insubstantial ) && !( <flags> & statf_stone ) && !( <flags> & statf_hidden ) && !( <flags> & statf_ridden ) local.attack=<uid> endif endif endif endif endif endif endfor if (<local.attack>) emote growl bark 2 tag.isattacking=<local.attack> attack=<local.attack> uid.<local.attack>.tag.isattackedby=<uid> endif elseif (<serv.chardef.<argv[0]>.baseid>==c_toad_giant) forchars <serv.distancetalk> if !(<local.attack>) if !(<uid>==<local.uid>) if (<notogetflag <uid>>==3) || (<notogetflag <uid>>==6) if (<str> < <uid.<local.uid>.str>) if !(<body>==c_toad_giant) if !( <flags> & statf-invul ) && !( <flags> & statf_freeze ) && !( <flags> & statf_invisible ) && !( <flags> & statf_sleeping ) && !( <flags> & statf_insubstantial ) && !( <flags> & statf_stone ) && !( <flags> & statf_hidden ) && !( <flags> & statf_ridden ) local.attack=<uid> endif endif endif endif endif endif endfor if (<local.attack>) bark 2 tag.isattacking=<local.attack> attack=<local.attack> uid.<local.attack>.tag.isattackedby=<uid> endif elseif (<serv.chardef.<argv[0]>.baseid>==c_spider_giant) forchars <serv.distancetalk> if !(<local.attack>) if !(<uid>==<local.uid>) if (<notogetflag <uid>>==3) || (<notogetflag <uid>>==6) if (<str> < <uid.<local.uid>.str>) if !(<body>==c_spider_giant) if !( <flags> & statf-invul ) && !( <flags> & statf_freeze ) && !( <flags> & statf_invisible ) && !( <flags> & statf_sleeping ) && !( <flags> & statf_insubstantial ) && !( <flags> & statf_stone ) && !( <flags> & statf_hidden ) && !( <flags> & statf_ridden ) local.attack=<uid> endif endif endif endif endif endif endfor if (<local.attack>) bark 2 tag.isattacking=<local.attack> attack=<local.attack> uid.<local.attack>.tag.isattackedby=<uid> endif elseif (<serv.chardef.<argv[0]>.baseid>==c_snake_giant) forchars <serv.distancetalk> if !(<local.attack>) if !(<uid>==<local.uid>) if (<notogetflag <uid>>==3) || (<notogetflag <uid>>==6) if (<str> < <uid.<local.uid>.str>) if !(<body>==c_snake_giant) if !( <flags> & statf-invul ) && !( <flags> & statf_freeze ) && !( <flags> & statf_invisible ) && !( <flags> & statf_sleeping ) && !( <flags> & statf_insubstantial ) && !( <flags> & statf_stone ) && !( <flags> & statf_hidden ) && !( <flags> & statf_ridden ) local.attack=<uid> endif endif endif endif endif endif endfor if (<local.attack>) emote hiss bark 2 tag.isattacking=<local.attack> attack=<local.attack> uid.<local.attack>.tag.isattackedby=<uid> endif endif endif [function npcai_lay_eggs] if (<serv.chardef.<argv[0]>.baseid>==c_alligator) serv.newitem=<qval <isempty <def.npcai_id_eggs>> ?i_eggs_fresh:<def0.npcai_id_eggs>> new.name=alligator eggs new.link=<uid> new.attr |= attr_decay new.p=<p> new.timer=<eval <serv.decaytimer> *60> emote lay <new.name> bark 2 anim=4 tag.actioninuse=1 timerf <eval <qval <isempty <def.npcai_timer_lay_eggs>> ?{300 450}:<def0.npcai_timer_lay_eggs>>>, tag.actioninuse= elseif (<serv.chardef.<argv[0]>.baseid>==c_bird) || (<serv.chardef.<argv[0]>.baseid>==c_eagle) serv.newitem=<qval <isempty <def.npcai_id_eggs>> ?i_eggs_fresh:<def0.npcai_id_eggs>> new.name=bird eggs new.color=colors_blue new.link=<uid> new.attr |= attr_decay new.p=<p> new.timer=<eval <serv.decaytimer> *60> emote lay <new.name> bark 2 anim=4 tag.actioninuse=1 timerf <eval <qval <isempty <def.npcai_timer_lay_eggs>> ?{300 450}:<def0.npcai_timer_lay_eggs>>>, tag.actioninuse= elseif (<serv.chardef.<argv[0]>.baseid>==c_chicken) serv.newitem=<qval <isempty <def.npcai_id_eggs>> ?i_eggs_fresh:<def0.npcai_id_eggs>> new.link=<uid> new.attr |= attr_decay new.p=<p> new.timer=<eval <serv.decaytimer> *60> emote lay <new.name> bark 2 anim=4 tag.actioninuse=1 timerf <eval <qval <isempty <def.npcai_timer_lay_eggs>> ?{300 450}:<def0.npcai_timer_lay_eggs>>>, tag.actioninuse= elseif (<serv.chardef.<argv[0]>.baseid>==c_snake) || (<serv.chardef.<argv[0]>.baseid>==c_snake_giant) serv.newitem=<qval <isempty <def.npcai_id_eggs>> ?i_eggs_fresh:<def0.npcai_id_eggs>> new.name=snake eggs new.color=colors_green new.link=<uid> new.attr |= attr_decay new.p=<p> new.timer=<eval <serv.decaytimer> *60> emote lay <new.name> bark 2 anim=4 tag.actioninuse=1 timerf <eval <qval <isempty <def.npcai_timer_lay_eggs>> ?{300 450}:<def0.npcai_timer_lay_eggs>>>, tag.actioninuse= endif [function npcai_poo] if (<serv.chardef.<argv[0]>.baseid>==c_rat) || (<serv.chardef.<argv[0]>.baseid>==c_rat_giant) emote lay a turd anim 1 bark 4 if !(<isempty <def.npcai_id_poo_rat>>) local.pooid=<def0.npcai_id_poo_rat> while !(strmatch(<local.pooid>,0)) local.x += 1 local.id.<dlocal.x>=<strarg <local.pooid>> local.pooid=<streat <local.pooid>> endwhile local.x=<eval {1 <local.x>}> endif if (<serv.itemdef.<local.id.<dlocal.x>>>) serv.newitem=<local.id.<dlocal.x>> else serv.newitem=i_horse_dung endif new.name=rat poo new.attr |= attr_move_never|attr_decay if (<def0.npcai_can_poo_effect>) new.morex=<qval !<def0.npcai_poo_effect> ?s_poison:<def0.npcai_poo_effect>> new.morey=<qval !<def0.npcai_poo_effect_strength> ?10.0:<def0.npcai_poo_effect_strength>> endif new.p=<p> new.timer=<eval <serv.decaytimer> *60> new.link=<uid> tag.actioninuse=1 timerf <eval <qval <isempty <def.npcai_timer_poo_rat>> ?{600 900}:<def0.npcai_timer_poo_rat>>>, tag.actioninuse= elseif (<serv.chardef.<argv[0]>.baseid>==c_horse_brown_lt) || (<serv.chardef.<argv[0]>.baseid>==c_horse_brown_dk) || (<serv.chardef.<argv[0]>.baseid>==c_horse_tan) || (<serv.chardef.<argv[0]>.baseid>==c_horse_gray) emote pinch a loaf anim 3 bark 3 if !(<isempty <def.npcai_id_poo_horse>>) local.pooid=<def0.npcai_id_poo_horse> while !(strmatch(<local.pooid>,0)) local.x += 1 local.id.<dlocal.x>=<strarg <local.pooid>> local.pooid=<streat <local.pooid>> endwhile local.x=<eval {1 <local.x>}> endif if (<serv.itemdef.<local.id.<dlocal.x>>>) serv.newitem=<local.id.<dlocal.x>> else serv.newitem=i_horse_dung endif new.attr |= attr_move_never|attr_decay doswitch <dir> new.p=<p.x>,<eval <p.y> +1>,<z>,<map> new.p=<eval <p.x> +-1>,<eval <p.y> +1>,<z>,<map> new.p=<eval <p.x> +-1>,<p.y>,<z>,<map> new.p=<eval <p.x> +-1>,<eval <p.y> +-1>,<z>,<map> new.p=<p.x>,<eval <p.y> +-1>,<z>,<map> new.p=<eval <p.x> +1>,<eval <p.y> +-1>,<z>,<map> new.p=<eval <p.x> +1>,<p.y>,<z>,<map> new.p=<eval <p.x> +1>,<eval <p.y> +1>,<z>,<map> end new.timer=<eval <serv.decaytimer> *60> tag.actioninuse=1 timerf <eval <qval <isempty <def.npcai_timer_poo_horse>> ?{600 900}:<def0.npcai_timer_poo_horse>>>, tag.actioninuse= endif [function npcai_throw_rock] local.rockid=<findid.<argv[0]>.dispiddec> local.color=<findid.<argv[0]>.color> if (<def0.npcai_can_throw_rock_need>) if (<findid.<argv[0]>>) consume 1 <argv[0]> local.canthrowrock=1 endif else local.canthrowrock=1 endif if (<local.canthrowrock>) serv.newitem=<local.rockid> new.attr |= attr_decay new.color=<local.color> new.p=<streat <streat <args>>> new.timer=30 effectto <new.dispiddec>, <p.x>, <p.y>, <eval <p.z> +7>, <new.p.x>, <new.p.y>, <eval <new.z> +3>, 0, 0, 0, <qval <local.color> ? <eval <local.color> +-1>:<local.color>>, 0 if (<distance <argv[1]>> < <serv.distancetalk>) if (<uid.<argv[1]>.distance <new.uid>>==0) uid.<argv[1]>.damage=<eval <qval <isempty <def.npcai_dam_rock>> ?{10 15}:<def0.npcai_dam_rock>>> 01 <uid> endif endif bark=2 endif tag.npcfightaction=2 [function npcai_breath_fire] serv.newitem=<qval <isempty <def.npcai_id_breath_explosion>> ?i_fx_explode:<def0.npcai_id_breath_explosion>> new.attr |= attr_decay|attr_move_never if !(<isempty <def.color_ice>>) if (<color>==<def0.color_ice>) local.color=<def0.color_ice> endif endif new.color=<local.color> new.p=<streat <args>> new.timer=3 effectto <qval <isempty <def.npcai_id_breath>> ?<new.dispiddec>:<def0.npcai_id_breath>>, <p.x>, <p.y>, <eval <p.z> +7>, <new.p.x>, <new.p.y>, <eval <new.z> +3>, 1, 0, 0, <qval <local.color> ? <eval <local.color> +-1>:<local.color>>, 0 new.npcai_breath_fire_explosion <uid> new.timerf 1, npcai_breath_fire_explosion <uid> new.timerf 2, npcai_breath_fire_explosion <uid> bark=3 tag.npcfightaction=2 [function npcai_breath_fire_explosion] local.uid=<uid> forchars 3 if (<isplayer>) damage=<eval <eval <qval <isempty <def.npcai_dam_breath>> ?{45 50}:<def0.npcai_dam_breath>>> /<qval !<distance <local.uid>> ?1:<distance <local.uid>>>> 01 <argn1> endif endfor [events e_npcai] on=@deathcorpse uid.<argo.uid>.tag.npc=<npc> on=@destroy if (<uid.<tag0.isattackedby>.ischar>) uid.<tag0.isattackedby>.tag.isattacking= endif on=@npcactfight if (<dtag0.npcfightaction>==1) return 1 elseif (<dtag0.npcfightaction>==2) tag.npcfightaction=3 timerf 30, tag.npcfightaction= endif if !(<tag0.npcfightaction>) if (<serv.skill.<action>.key>==wrestling) if (<distance> > 3) if (<body>==c_cyclops) || (<body>==c_ettin) || (<body>==c_ettin_w_axe) || (<body>==c_ogre) || (<body>==c_titan) || (<body>==c_troll) || (<body>==c_troll_w_mace) || (<body>==c_troll_w_axe) if (<def0.npcai_can_throw_rock>) if !(<isempty <def.npcai_id_rock>>) local.rock=<def0.npcai_id_rock> while !(strmatch(<local.rock>,0)) local.x += 1 local.rock.<dlocal.x>=<strarg <local.rock>> local.rock=<streat <local.rock>> endwhile local.x=<eval {1 <local.x>}> local.rock=<local.rock.<dlocal.x>> else local.rock=i_rock_plain endif if (<def0.npcai_can_throw_rock_need>) if (<restest <local.rock>>) local.canthrowrock=1 endif else local.canthrowrock=1 endif if (<local.canthrowrock>) anim=12 emote throw a rock at <src.name> timerf 3, npcai_throw_rock <local.rock>, <src.uid>, <src.p> tag.npcfightaction=1 endif endif endif if (<npc>==brain_dragon) if (<def0.npcai_can_breath_fire>) anim=12 emote breath fire at <src.name> timerf 3, npcai_breath_fire <src.uid>, <src.p> tag.npcfightaction=1 endif endif endif endif endif return 0 on=@skillgain if (<eval <<serv.skill.<argn1>.key>>> < <qval <serv.skillclass.0.<serv.skill.<argn1>.key>> ?<serv.skillclass.0.<serv.skill.<argn1>.key>>:1000>) local.rand=<eval {<eval <<serv.skill.<argn1>.key>> <qval <serv.skillclass.0.<serv.skill.<argn1>.key>> ?<serv.skillclass.0.<serv.skill.<argn1>.key>>:1000>}> if (<dlocal.rand> < 25) <serv.skill.<argn1>.key>=<<serv.skill.<argn1>.key>> +0.1 endif endif on=@regionenter if !(<tag0.npcai>) npcai endif on=@npcai_skillsuccess if (<serv.skill.<argn1>.key>==fishing) if (<uid.<argn2>.isitem>) if !(<uid.<argn2>.more1>==mr_nothing) local.rand=<eval {<eval <fishing>> 1000}> if (<dlocal.rand> > 25) uid.<argn2>.amount=1 serv.newitem=<serv.regionresource.<uid.<argn2>.more1>.reap> new.amount=<uid.<argn2>.amount> effectto <new.dispiddec>, <uid.<argn2>.p.x>, <uid.<argn2>.p.y>, <eval <uid.<argn2>.z> +3>, <p.x>, <p.y>, <eval <z> +7>, 1, <dir>, 0, <qval <new.color> ?<eval <new.color> +-1>:0>, 0 trysrc <uid> new.drop emote catch a <new.name> sound=<eval <qval <isempty <def.npcai_snd_fish>> ?{025 026}:<def0.npcai_snd_fish>>> endif skillgain fishing <eval <fishing> /10> endif else emote could not find anything endif timerf <eval <qval <isempty <def.npcai_timer_fish>> ?{15 30}:<def0.npcai_timer_fish>>>, tag.usingskill= elseif (<serv.skill.<argn1>.key>==mining) if (<uid.<argn2>.isitem>) if !(<uid.<argn2>.more1>==mr_nothing) local.rand=<eval {<eval <mining>> 1000}> if (<dlocal.rand> > 25) uid.<argn2>.amount=<eval {1 5}> serv.newitem=<serv.regionresource.<uid.<argn2>.more1>.reap> new.amount=<uid.<argn2>.amount> effectto <new.dispiddec>, <uid.<argn2>.p.x>, <uid.<argn2>.p.y>, <eval <uid.<argn2>.z> +3>, <p.x>, <p.y>, <eval <z> +7>, 1, <dir>, 0, <qval <new.color> ?<eval <new.color> +-1>:0>, 0 trysrc <uid> new.bounce emote dig <new.name> sound=<eval <qval <isempty <def.npcai_snd_mine>> ?{0125 0126}:<def0.npcai_snd_mine>>> endif skillgain mining <eval <mining> /10> endif else emote could not find anything endif timerf <eval <qval <isempty <def.npcai_timer_mine>> ?{15 30}:<def0.npcai_timer_mine>>>, tag.usingskill= elseif (<serv.skill.<argn1>.key>==lumberjacking) if (<uid.<argn2>.isitem>) if !(<uid.<argn2>.more1>==mr_nothing) local.rand=<eval {<eval <lumberjacking>> 1000}> if (<dlocal.rand> > 25) uid.<argn2>.amount=<eval {1 3}> if (<argn3>) serv.newitem=i_kindling else serv.newitem=<serv.regionresource.<uid.<argn2>.more1>.reap> endif new.amount=<uid.<argn2>.amount> effectto <new.dispiddec>, <uid.<argn2>.p.x>, <uid.<argn2>.p.y>, <eval <uid.<argn2>.z> +3>, <p.x>, <p.y>, <eval <z> +7>, 1, <dir>, 0, <qval <new.color> ?<eval <new.color> +-1>:0>, 0 trysrc <uid> new.bounce if (<new.baseid>==i_log) || (<new.baseid>==i_kindling) emote chop <new.name> else emote chop <qval <new.amount>==1 ?<new.name> log:<new.name> logs> endif sound=<eval <qval <isempty <def.npcai_snd_chop>> ?{0147 0148}:<def0.npcai_snd_chop>>> endif skillgain mining <eval <lumberjacking> /10> endif else emote could not find anything endif timerf <eval <qval <isempty <def.npcai_timer_chop>> ?{15 30}:<def0.npcai_timer_chop>>>, tag.usingskill= endif [events e_npcai_players] on=@itemstep if (<def0.npcai_can_poo_effect>) if (<act.baseid>==<qval <isempty <def.npcai_id_poo>> ?i_horse_dung:<def0.npcai_id_poo>>) if (<act.morex>) && (<act.morey>) spelleffect <act.morex>, <act.morey>, <act.link.uid> //effectcmp=3,<serv.spell.<act.morex>.effect_id>,15,15,1 //sound=<serv.spell.<act.morex>.sound> endif endif endif if (<def0.npcai_can_step_eggs>) if (<serv.itemdef.<qval <isempty <def.npcai_id_eggs>> ?i_eggs_fresh:<def0.npcai_id_eggs>>>) if (<act.dispid>==<qval <isempty <def.npcai_id_eggs>> ?i_eggs_fresh:<def0.npcai_id_eggs>>) act.dispid=<qval <isempty <def.npcai_id_eggs_stepped>> ?i_eggshells:<def0.npcai_id_eggs_stepped>> act.name=<serv.itemdef.<act.dispid>.name> act.update act.sound=<eval <def0.npcai_snd_eggs_stepped>> endif endif endif [function effectto] forclients 18 if (<account.resdisp> >= 4) sendpacket 0c0 00 00 00 00 00 00 00 00 00 W<argv[0]> W<argv[1]> W<argv[2]> B<argv[3]> W<argv[4]> W<argv[5]> B<argv[6]> B<argv[7]> 00 00 00 B<argv[8]> B<argv[9]> D<argv[10]> D<argv[11]> endif endfor [function effectcmp] if !(<isempty <strarg <argv[4]>>>) local.explode=<strarg <argv[4]>> endif if !(<isempty <strarg <streat <argv[4]>>>>) local.color=<strarg <streat <argv[4]>>> endif if !(<isempty <strarg <streat <streat <argv[4]>>>>>) local.render=<strarg <streat <streat <argv[4]>>>> endif if !(<isempty <argv[5]>>) local.render=<argv[5]> endif local.src=<uid> if !(<eval <argv[0]>>) forclients 18 if (<account.resdisp> >= 4) sendpacket 0c0 b<argv[0]> d<src.uid> d<local.src> w<argv[1]> w<src.p.x> w<src.p.y> b<src.z> w<uid.<local.src>.p.x> w<uid.<local.src>.p.y> b<uid.<local.src>.z> b<argv[2]> b<argv[3]> w0 b01 b<local.explode> d<local.color> d<local.render> endif endfor elseif (<eval <argv[0]>>==1) && !(<isitem>) forclients 18 if (<account.resdisp> >= 4) sendpacket 0c0 b<argv[0]> d<local.src> d<uid> w0 w0 w0 b0 w0 w0 b0 b0 b0 w0 b0 b0 d0 d0 endif endfor elseif (<eval <argv[0]>>==2) && (<isitem>) forclients 18 if (<account.resdisp> >= 4) sendpacket 0c0 b<argv[0]> d<local.src> d<uid> w<argv[1]> w<uid.<local.src>.p.x> w<uid.<local.src>.p.y> b<uid.<local.src>.z> w0 w0 b0 b<argv[2]> b<argv[3]> w0 b01 b0 d<local.color> d<local.render> endif endfor elseif (<eval <argv[0]>>==3) && !(<isitem>) forclients 18 if (<account.resdisp> >= 4) sendpacket 0c0 b<argv[0]> d<local.src> d<uid> w<argv[1]> w<uid.<local.src>.p.x> w<uid.<local.src>.p.y> b<uid.<local.src>.z> w0 w0 b0 b<argv[2]> b<argv[3]> w0 b01 b0 d<local.color> d<local.render> endif endfor elseif (<eval <argv[0]>>==4) if (<account.resdisp> >= 4) sendpacket 070 b<argv[0]> d<local.src> d<uid> w<argv[1]> w0 w0 b0 w0 w0 b0 b0 b0 w0 b0 b0 endif endif [eof] ********************************************************************************* ***************************************************************** [plevel 6] enable_npcai //******************************************** This command enables the script in game [defname npcai] npcai_maps 5 //Total amount of maps your server uses. //****************************************** This is how many maps you want the script to work on..Mine is set to one /////*********************** All these are variables (things the npc can so ) so this could be stuff like fight and one thing is sell and buy from vendors.. Kind of have to think what a player does, but buy and sell to vendors would add the ability to create an AI functioning economy.. npcai_can_eatfood_pack 1 //Do NPCs eat food out of pack? npcai_can_eatfood_corpse 1 //Do NPCs eat corpses? npcai_can_eatfood_hunt 1 //Do NPCs hunt and kill for food? npcai_can_eatfood_eggs 1 //Do NPCs eat eggs? npcai_can_eatfood_changecolor 1 //Do NPCs change colors if they eat? npcai_can_poo_rat 1 //Do Rats 'poo'? npcai_can_poo_horse 1 //Do Horses 'poo'? npcai_can_poo_effect 1 //Do Rat 'poos' have a spelleffect? (Defined below) npcai_can_mine 1 //Do NPCs mine ore? npcai_can_chop 1 //Do NPCs chop wood? npcai_can_chop_kindling 1 //Do NPCs chop kindling? npcai_can_fish 1 //Do NPCs fish? npcai_can_lay_eggs_alligators 1 //Do Alligators lay eggs? npcai_can_lay_eggs_birds 1 //Do Birds lay eggs? npcai_can_lay_eggs_chickens 1 //Do Chickens lay eggs? npcai_can_lay_eggs_snakes 1 //Do Snakes lay eggs? npcai_can_step_eggs 1 //Do eggs get crushed when stepped on? npcai_can_throw_rock 1 //Do NPCs throw rocks? npcai_can_throw_rock_need 1 //Do NPCs need a rock in their pack? npcai_can_breath_fire 1 //Do NPCs breath fire? npcai_id_eatfood_changecolor t_ore, t_ingot, t_log, t_board //NPCs will change colors to these item ids and types when eaten. npcai_id_poo_rat i_horse_dung //ID of 'poo' for Rats npcai_id_poo_horse i_horse_dung //ID of 'poo' for Horses npcai_id_kindling i_kindling //ID of the kindling NPCs chop npcai_id_rock i_rock_plain //ID of Rock(s) thrown by Cyclops, Ettins, Ogres, Titans, Trolls npcai_id_breath i_fire_column //ID of fire breathed by NPCs npcai_id_breath_explosion i_fx_explode //ID of explosion breathed by NPCs npcai_id_eggs i_eggs_fresh //ID of freshly laid eggs npcai_id_eggs_stepped i_eggshells //ID of stepped on eggs npcai_resource_ore mr_nothing, mr_rusty, mr_iron, mr_copper //Region Resource ID(s) for NPCs that mine ore npcai_resource_chop mr_nothing, mr_tree //Region Resource ID(s) for NPCs that chop wood npcai_resource_fish mr_nothing, mr_fish1, mr_fish2, mr_fish3, mr_fish4 //Region Resource ID(s) for NPCs that fish fish npcai_snd_eat {03a 03c} //SFX for eating food, corpses, eggs npcai_snd_fish {025 026} //SFX for fishing fish npcai_snd_chop {0147 0148} //SFX for chopping a tree npcai_snd_mine {0125 0126} //SFX for mining ore npcai_snd_eggs_stepped {01c2 01c6} //SFX of stepping on eggs npcai_poo_effect s_poison //Spelleffect of poisonous Rat 'poo' npcai_poo_effect_strength 10.0 //Strength of the spelleffect of poisonous Rat 'poo' npcai_dam_rock {10 15} //Damage received when being hit by a rock npcai_dam_breath {45 50} //Damage received when being hit by dragon's breath npcai_timer_delay {1 360} //Delay in seconds between 'checks' for NPCs to do 'things' - larger the range in value the less CPU this script will use, lower the value and NPCs will do 'things' more often, default: {1 360} - Use cautiously //****************** This section is where stuff like fight and craft would be extended and also buy and sell. npcai_timer_fish {15 30} //Time between the use of fishing by NPCs npcai_timer_chop {15 30} //Time between the use of lumberjacking by NPCs npcai_timer_mine {15 30} //Time between the use of mining by NPCs // Some ideas to add to make the npc more player like // npcai_timer_sell {15 30} // npcai_timer_buy {15 30} // npcai_timer_huntmonsters {15 30} //npcai_timer_craft_tinker{15 30} //npcai_timer_craft_blacksmith{15 30} //npcai_timer_craft_carpentry{15 30} //******************************************************************* npcai_timer_eatfood_decay 10 //Time until food drops by 1 in value npcai_timer_eatfood_hungry {600 660} //Time between eating food if NPC is hungry npcai_timer_eatfood_hungrier {330 360} //Time between eating food if NPC is very hungry npcai_timer_eatfood_hungriest {180 210} //Time between eating food if NPC is extremely hungry npcai_timer_eatfood_replenish 30 //Time until an NPC replenishes it's foodtypes after becoming full npcai_timer_poo_rat {1200 1800} //Time between each Rat 'poo' npcai_timer_poo_horse {900 1200} //Time between each Horse 'poo' npcai_timer_lay_eggs {450 600} //Time between eggs laid by NPCs npcai_timer_throw_rock {15 30} //Time between each rock thrown by an NPC ******************************************************************************* //*************** So thats a nice chunk of the entire code just used for variables. |