diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json index 2799e9e..43d8d56 100755 --- a/DataCollection/gamedata.json +++ b/DataCollection/gamedata.json @@ -209,6 +209,7 @@ "end_of_meta":"^Z", "back_to_map":"^M", "back_to_map_horse":"^MM", + "r1":"^R1", "long_full_line":"^L", "fountain":"Although it's not recommended, you could drink from this fountain if you are thirsty...^T6Drink from the public fountain. ^B1D^R1^X^Z", "venus_flytrap_format":"The Giant Venus Flytrap chomped at you!
OUCH!!
It chomped your pocket, taking $%MONEY% with it!!", @@ -218,13 +219,17 @@ "player_interaction":{ "players_here":"Players Here:", "menu":"^I%PLAYERICON%^T1%PLAYERNAME%%BUTTONS%^R1", - "multiple_players_menu":"^B5AHUG^B5BDOG PILE^B5CDANCE^B5DHUDDLE^B5EHOWL^R1", "profiile_button":"^B1L%PLAYERID%", "social_button":"^B1S%PLAYERID%", "trade_button":"^B1T%PLAYERID%", "buddy_button":"^B1B%PLAYERID%", "tag_button":"^B1X%PLAYERID%", "pm_button":"^B1P%PLAYERNAME%", + "socials":{ + "socials_button":"^B5%ID%%SOCIALNAME%", + "socials_message":"* %SOCIALMSG% *", + "socials_menu_type":"^L%TYPE%:^R1" + }, "trade":{ "trading_with":"^ATTrading with %PLAYERNAME%", @@ -644,6 +649,8 @@ "cant_release_currently_riding":"You cannot release the horse you are riding!", "released_horse":"You released the horse! It now roams Horse Isle freely. It will disappear in an hour.", "horse_bucked":"Your inexperienced horse has become frustrated and has bucked you off! (Horse gained 1exp)", + "llama_bucked":"Your inexperienced llama has become tired and lain down! (Llama gained 1exp)", + "camel_bucked":"Your inexperienced camel got frustrated and spat angrily, bumping you off! (Camel gained 1exp)", "auto_sell_success":"Horse %HORSENAME% Purchase Completed!", "auto_sell_insufficent_money":"You cannot afford that horse!", @@ -1013,112 +1020,6 @@ }, "seperator":"
", }, - "socials":{ - "for_sender":{ - "friendly":{ - "smile":"* You smile at %USERNAME%. *", - "wave":"* You wave enthusiastically at %USERNAME%! *", - "wink":"* You sneak a wink off to %USERNAME%. *", - "laugh":"* You laugh at %USERNAME%'s humor. *", - "high5":"* You give a big high-five to %USERNAME%! *", - "clap":"* You clap at what %USERNAME% has done! *", - "hug":"* You give %USERNAME% a welcome hug. *", - "bearhug":"* You nearly crush %USERNAME% with your massive bearhug! *", - "dance":"* You do a little dance with %USERNAME%! *", - "nod":"* You nod at %USERNAME%. *", - "tickle":"* You tickle %USERNAME%'s sides. *", - "thumbsup":"* You give %USERNAME% an enthusiastic thumbs up. *", - "shoulderpat":"* You pat %USERNAME% comfortingly on the shoulder. *", - "circle":"* You run circles around %USERNAME% making them dizzy. *", - "glomp":"* You surprise %USERNAME% by tackling and hugging them very tightly! %USERNAME% squeaks in surprise! *", - "beam":"* You produce one of the biggest, happiest faces possible towards %USERNAME%! *", - "handshake":"* You shake hands with %USERNAME% enthusiastically. *", - "rofl":"* %USERNAME% is so funny you end up rolling on the floor from laughing so hard!! *", - "spin":"* You playfully spin %USERNAME% in circles making them dizzy. *", - "sing":"* You sing a silly song to %USERNAME% hoping they laugh. *", - "flail":"* You flail wildly at %USERNAME%! *" - }, - "unfriendly":{ - "frown":"* You frown upon %USERNAME%'s behavior. *", - "poke":"* You poke %USERNAME% right in the ribs! *", - "ignore":"* You stick your nose in the air and ignore %USERNAME%s childish behavior! *", - "growl":"* In a deep growling voice, you attempt to frighten %USERNAME%! *", - "point":"* You point jokingly at %USERNAME%! *", - "burp":"* BuuuuuuuurrrrP! *", - "cry":"* %USERNAME% has made you cry like a little baby! *", - "yell":"* You start yelling angrily at %USERNAME%. *", - "nudge":"* You nudge %USERNAME% carefully out of your way. *", - "yawn":"* YYYYAAAAWWWWNNNNN... Boy %USERNAME% is boring... *", - "tease":"* You laughingly tease %USERNAME% about their silly shoes. *", - "quack":"* You make weird animal noises at %USERNAME% trying to sound like a ferocious... duck. *", - "snore":"* ZZzzzzz.... %USERNAME% has bored you to the point of SNORING!! Wow.. now, that is boring.. *", - "scream":"* AAAAAAAAAAAAAHHH!!!! You scream loudly at %USERNAME%.. . maybe overreacting? *", - "hide":"* You quickly hide in the shadows, hoping %USERNAME% does not see you. . . *", - "trip":"* Poor %USERNAME% tripped over your giant hobbitty feet!! *", - "roar":"* From the bottom of your being you release the loudest roar possible!. . Only. . on its way out, your voice squeaks a little, and that takes away from the intimidation. . . *", - "boo":"* BOOOOO! You frighten %USERNAME% really bad! They did not see that coming! *" - }, - "horse":{ - "wink":"* Your horse winks at %USERNAME%. *", - "neigh":"* Your horse neighs loudly at %USERNAME%. *", - "whinny":"* Your horse whinnies softly and happily towards %USERNAME%. *", - "snort":"* Your horse rudely snorts towards %USERNAME%! *", - "buck":"* Your horse bucks you lightly. Must have been excited to see %USERNAME%. *" - } - }, - "for_others":{ - "friendly":{ - "smile":"* %USERNAME% smiles at you. *", - "wave":"* %USERNAME% is waving at you very enthusiastically! *", - "wink":"* %USERNAME% winks at you secretively. *", - "laugh":"* %USERNAME% laughs at your humor. *", - "high5":"* %USERNAME% comes at you with a high-five! You manage to meet the clap in time! *", - "clap":"* %USERNAME% is clapping at what you have accomplished! *", - "hug":"* %USERNAME% gives you a hug. *", - "bearhug":"* %USERNAME% nearly crushes you with a massive bearhug! *", - "dance":"* %USERNAME% and you do a little dance! *", - "nod":"* %USERNAME% nods at you. *", - "tickle":"* %USERNAME% tickles your sides until you fall over laughing. *", - "thumbsup":"* %USERNAME% gives you an enthusiastic thumbs up. *", - "shoulderpat":"* %USERNAME% comfortingly pats you on the shoulder. *", - "circle":"* %USERNAME% excitedly runs circles around you causing your head to spin. *", - "glomp":"* All of a sudden %USERNAME% tackles you and starts to hug you very tightly! You squeak in surprise! *", - "beam":"* %USERNAME% produces one of the biggest, happiest faces you've ever seen towards you!!! Wow, you must have made them happy. *", - "handshake":"* %USERNAME% shakes hands with you enthusiastically. *", - "rofl":"* You were so funny that %USERNAME% is rolling on the floor from laughing so hard!! *", - "spin":"* %USERNAME% playfully spins you in circles. You are getting quite dizzy. *", - "sing":"* %USERNAME% sings you a silly song. You burst out laughing. *", - "flail":"* You must have done something exciting, because %USERNAME% is flailing at you wildly! *" - }, - "unfriendly":{ - "frown":"* Upon your behavior, %USERNAME% frowns deeply. *", - "poke":"* %USERNAME% has poked you right in the ribs! *", - "ignore":"* %USERNAME% sticks their nose in the air ignoring your childish behavior! *", - "growl":"* You are frightened by a deep growl! It's directed at you from %USERNAME%! *", - "point":"* %USERNAME% points jokingly at you! *", - "burp":"* Buuurrrp! You can't believe %USERNAME% just did that towards you! *", - "cry":"* %USERNAME% is crying like a little baby because of you now! *", - "yell":"* %USERNAME% is yelling at you! You must have done something wrong. *", - "nudge":"* %USERNAME% gives you a careful nudge out of the way. *", - "yawn":"* YYYAAAWWWNN... you are boring %USERNAME%! *", - "tease":"* %USERNAME% laughingly teases you about your silly shoes. *", - "quack":"* %USERNAME% makes weird animal noises at you. Was that a duck? *", - "snore":"* ZZzzzzz.... You have bored %USERNAME% to the point of SNORING!! Ooops! *", - "scream":"* AAAAAAAAAAAAAHHH!!!! %USERNAME% screams loudly at you.. . overreacting a bit!? *", - "hide":"* %USERNAME% quickly hides in the shadows, hoping you do not see them. . . *", - "trip":"* You tripped over %USERNAME%'s giant hobbitty feet!! Poor you! *", - "roar":"* From the bottom of %USERNAME%'s being they release the loudest roar possible towards you!. . Only. . on its way out, their voice squeaks a little, and that takes away from the intimidation. . . *", - "boo":"* BOOOOOOOO! %USERNAME% frightens you really bad! You did not see that coming! *" - }, - "horse":{ - "wink":"* %USERNAME%'s horse winks at you! *", - "neigh":"* %USERNAME%'s horse neighs loudly at you. *", - "whinny":"* %USERNAME%'s horse whinnies softly and happily towards you. *", - "snort":" * %USERNAME%'s horse rudely snorts towards you! *", - "buck":"* %USERNAME%'s horse bucks lightly. Must have been excited to see you. *" - } - } - }, "chat":{ "for_others":{ "global_format":"%USERNAME%: %MESSAGE%", @@ -550751,6 +550652,420 @@ {"trainer_id":9,"improves_stat":"agility","improves_amount":10,"thirst_cost":50,"mood_cost":20,"hunger_cost":50,"money_cost":750,"experience":10}, {"trainer_id":10,"improves_stat":"endurance","improves_amount":10,"thirst_cost":80,"mood_cost":20,"hunger_cost":80,"money_cost":750,"experience":5} ], + "social_types":[ + { + "type": "FRIENDLY", + "socials": [ + { + "social_id": 1, + "button_name": "SMILE", + "for_sender": "You smile at %TARGETNAME%.", + "for_target": "%SENDERNAME% smiles at you.", + "for_everyone": "%SENDERNAME% smiled at %TARGETNAME%.", + "sound_effect": null + }, + { + "social_id": 2, + "button_name": "WAVE", + "for_sender": "You wave enthusiastically at %TARGETNAME%!", + "for_target": "%SENDERNAME% is waving at you very enthusiastically!", + "for_everyone": "%SENDERNAME% waved at %TARGETNAME%.", + "sound_effect": null + }, + { + "social_id": 3, + "button_name": "WINK", + "for_sender": "You sneak a wink off to %TARGETNAME%.", + "for_target": "%SENDERNAME% winks at you secretively.", + "for_everyone": null, + "sound_effect": null + }, + { + "social_id": 4, + "button_name": "LAUGH", + "for_sender": "You laugh at %TARGETNAME%'s humor.", + "for_target": "%SENDERNAME% laughs at your humor.", + "for_everyone": "%SENDERNAME% laughs heartily at %TARGETNAME%'s humor.", + "sound_effect": null + }, + { + "social_id": 11, + "button_name": "HIGH5", + "for_sender": "You give a big high-five to %TARGETNAME%!", + "for_target": "%SENDERNAME% comes at you with a high-five! You manage to meet the clap in time!", + "for_everyone": "%TARGETNAME% is being high-fived by %SENDERNAME% for some reason.", + "sound_effect": "HI5" + }, + { + "social_id": 12, + "button_name": "CLAP", + "for_sender": "You clap at what %TARGETNAME% has done!", + "for_target": "%SENDERNAME% is clapping at what you have accomplished!", + "for_everyone": "%SENDERNAME% is clapping for %TARGETNAME%.", + "sound_effect": "CLAP" + }, + { + "social_id": 13, + "button_name": "HUG", + "for_sender": "You give %TARGETNAME% a welcome hug.", + "for_target": "%SENDERNAME% gives you a hug.", + "for_everyone": "%SENDERNAME% gave %TARGETNAME% a hug.", + "sound_effect": null + }, + { + "social_id": 14, + "button_name": "BEARHUG", + "for_sender": "You nearly crush %TARGETNAME% with your massive bearhug!", + "for_target": "%SENDERNAME% nearly crushes you with a massive bearhug!", + "for_everyone": "Wow! %TARGETNAME% was almost crushed by %SENDERNAME%'s bearhug!", + "sound_effect": null + }, + { + "social_id": 15, + "button_name": "DANCE", + "for_sender": "You do a little dance with %TARGETNAME%!", + "for_target": "%SENDERNAME% and you do a little dance! ", + "for_everyone": "%SENDERNAME% and %TARGETNAME% do a little dance around the place..", + "sound_effect": null + }, + { + "social_id": 17, + "button_name": "NOD", + "for_sender": "You nod at %TARGETNAME%.", + "for_target": "%SENDERNAME% nods at you.", + "for_everyone": "%SENDERNAME% nods at %TARGETNAME%.", + "sound_effect": null + }, + { + "social_id": 18, + "button_name": "TICKLE", + "for_sender": "You tickle %TARGETNAME%'s sides.", + "for_target": "%SENDERNAME% tickles your sides until you fall over laughing.", + "for_everyone": "%SENDERNAME% is tickling %TARGETNAME%'s sides.", + "sound_effect": "TICL" + }, + { + "social_id": 21, + "button_name": "THUMBS UP", + "for_sender": "You give %TARGETNAME% an enthusiastic thumbs up.", + "for_target": "%SENDERNAME% gives you an enthusiastic thumbs up.", + "for_everyone": "%SENDERNAME% is giving %TARGETNAME% a thumbs up for some reason.", + "sound_effect": "THUP" + }, + { + "social_id": 23, + "button_name": "SHOULDER PAT", + "for_sender": "You pat %TARGETNAME% comfortingly on the shoulder.", + "for_target": "%SENDERNAME% comfortingly pats you on the shoulder.", + "for_everyone": "%SENDERNAME% pats %TARGETNAME% on the shoulder.", + "sound_effect": null + }, + { + "social_id": 24, + "button_name": "CIRCLE", + "for_sender": "You run circles around %TARGETNAME% making them dizzy.", + "for_target": "%SENDERNAME% excitedly runs circles around you causing your head to spin.", + "for_everyone": "%SENDERNAME% runs circles around %TARGETNAME% making %TARGETNAME% dizzy.", + "sound_effect": null + }, + { + "social_id": 38, + "button_name": "GLOMP", + "for_sender": "You surprise %TARGETNAME% by tackling and hugging them very tightly! %TARGETNAME% squeaks in surprise!", + "for_target": "All of a sudden %SENDERNAME% tackles you and starts to hug you very tightly! You squeak in surprise!", + "for_everyone": "All of a sudden %SENDERNAME% tackles %TARGETNAME% and starts to hug them very tightly! %TARGETNAME% squeaks in surprise!", + "sound_effect": null + }, + { + "social_id": 40, + "button_name": "BEAM", + "for_sender": "You produce one of the biggest, happiest faces possible towards %TARGETNAME%!", + "for_target": "%SENDERNAME% produces one of the biggest, happiest faces you've ever seen towards you!!! Wow, you must have made them happy.", + "for_everyone": "%SENDERNAME% produces one of the biggest, happiest faces you've ever seen towards %TARGETNAME%!!!", + "sound_effect": null + }, + { + "social_id": 45, + "button_name": "HANDSHAKE", + "for_sender": "You shake hands with %TARGETNAME% enthusiastically.", + "for_target": "%SENDERNAME% shakes hands with you enthusiastically.", + "for_everyone": "%SENDERNAME% is shaking hands with %TARGETNAME% quite enthusiastically.", + "sound_effect": null + }, + { + "social_id": 46, + "button_name": "ROFL", + "for_sender": "%TARGETNAME% is so funny you end up rolling on the floor from laughing so hard!!", + "for_target": "You were so funny that %SENDERNAME% is rolling on the floor from laughing so hard!!", + "for_everyone": "%SENDERNAME% is laughing so hard at %TARGETNAME% that %SENDERNAME% is rolling on the floor!!", + "sound_effect": null + }, + { + "social_id": 48, + "button_name": "SPIN", + "for_sender": "You playfully spin %TARGETNAME% in circles making them dizzy.", + "for_target": "%SENDERNAME% playfully spins you in circles. You are getting quite dizzy.", + "for_everyone": "%SENDERNAME% is spinning %TARGETNAME% in circles. You are getting dizzy just watching!", + "sound_effect": null + }, + { + "social_id": 51, + "button_name": "SING", + "for_sender": "You sing a silly song to %TARGETNAME% hoping they laugh.", + "for_target": "%SENDERNAME% sings you a silly song. You burst out laughing. ", + "for_everyone": "%SENDERNAME% is singing a silly song to %TARGETNAME%. You can't help but laugh yourself.", + "sound_effect": null + }, + { + "social_id": 52, + "button_name": "FLAIL", + "for_sender": "You flail wildly at %TARGETNAME%!", + "for_target": "You must have done something exciting, because %SENDERNAME% is flailing at you wildly!", + "for_everyone": "%TARGETNAME% must have done something exciting, because %SENDERNAME% is flailing at %TARGETNAME% wildly!", + "sound_effect": null + } + ] + }, + { + "type": "UNFRIENDLY", + "socials": [ + { + "social_id": 5, + "button_name": "FROWN", + "for_sender": "You frown upon %TARGETNAME%'s behavior.", + "for_target": "Upon your behavior, %SENDERNAME% frowns deeply.", + "for_everyone": "%SENDERNAME% frowns upon %TARGETNAME%'s behavior.", + "sound_effect": null + }, + { + "social_id": 6, + "button_name": "POKE", + "for_sender": "You poke %TARGETNAME% right in the ribs!", + "for_target": "%SENDERNAME% has poked you right in the ribs!", + "for_everyone": "%SENDERNAME% poked %TARGETNAME% right in the ribs!", + "sound_effect": "POKE" + }, + { + "social_id": 7, + "button_name": "IGNORE", + "for_sender": "You stick your nose in the air and ignore %TARGETNAME%s childish behavior!", + "for_target": "%SENDERNAME% sticks their nose in the air ignoring your childish behavior!", + "for_everyone": "%SENDERNAME% is ignoring %TARGETNAME%'s childish behavior.", + "sound_effect": null + }, + { + "social_id": 8, + "button_name": "GROWL", + "for_sender": "In a deep growling voice, you attempt to frighten %TARGETNAME%!", + "for_target": "You are frightened by a deep growl! It's directed at you from %SENDERNAME%!", + "for_everyone": "A scary growl emanating from %SENDERNAME% is directed at %TARGETNAME%. You try to stay away.", + "sound_effect": "GRWL" + }, + { + "social_id": 9, + "button_name": "POINT", + "for_sender": "You point jokingly at %TARGETNAME%!", + "for_target": "%SENDERNAME% points jokingly at you!", + "for_everyone": "%SENDERNAME% points jokingly at %TARGETNAME%!", + "sound_effect": "PNT" + }, + { + "social_id": 10, + "button_name": "BURP", + "for_sender": "BuuuuuuuurrrrP!", + "for_target": "Buuurrrp! You can't believe %SENDERNAME% just did that towards you!", + "for_everyone": "BuuuurrrP! %SENDERNAME% just made a gross sound towards %TARGETNAME%!", + "sound_effect": "BURP" + }, + { + "social_id": 16, + "button_name": "CRY", + "for_sender": "%TARGETNAME% has made you cry like a little baby!", + "for_target": "%SENDERNAME% is crying like a little baby because of you now!", + "for_everyone": "%TARGETNAME% has made %SENDERNAME% cry like a little baby! How sad.", + "sound_effect": "CRY" + }, + { + "social_id": 19, + "button_name": "YELL", + "for_sender": "You start yelling angrily at %TARGETNAME%.", + "for_target": "%SENDERNAME% is yelling at you! You must have done something wrong.", + "for_everyone": "%SENDERNAME% is yelling at %TARGETNAME%!", + "sound_effect": "YELL" + }, + { + "social_id": 20, + "button_name": "NUDGE", + "for_sender": "You nudge %TARGETNAME% carefully out of your way.", + "for_target": "%SENDERNAME% gives you a careful nudge out of the way.", + "for_everyone": "%TARGETNAME% was nudged out of %SENDERNAME%'s way.", + "sound_effect": null + }, + { + "social_id": 22, + "button_name": "YAWN", + "for_sender": "YYYYAAAAWWWWNNNNN... Boy %TARGETNAME% is boring...", + "for_target": "YYYAAAWWWNN... you are boring %SENDERNAME%!", + "for_everyone": "%SENDERNAME% just yawned at %TARGETNAME%.", + "sound_effect": null + }, + { + "social_id": 37, + "button_name": "TEASE", + "for_sender": "You laughingly tease %TARGETNAME% about their silly shoes.", + "for_target": "%SENDERNAME% laughingly teases you about your silly shoes.", + "for_everyone": "%SENDERNAME% is laughingly teasing %TARGETNAME% about their silly shoes. You don't see anything silly about them.", + "sound_effect": null + }, + { + "social_id": 39, + "button_name": "QUACK", + "for_sender": "You make weird animal noises at %TARGETNAME% trying to sound like a ferocious... duck.", + "for_target": "%SENDERNAME% makes weird animal noises at you. Was that a duck?", + "for_everyone": "%SENDERNAME% makes weird animal noises at %TARGETNAME%. Was that a duck?", + "sound_effect": null + }, + { + "social_id": 41, + "button_name": "SNORE", + "for_sender": "ZZzzzzz.... %TARGETNAME% has bored you to the point of SNORING!! Wow.. now, that is boring.. ", + "for_target": "ZZzzzzz.... You have bored %SENDERNAME% to the point of SNORING!! Ooops! ", + "for_everyone": "ZZzzzzz.... %TARGETNAME% has bored %SENDERNAME% to the point of SNORING!! Wow.. now, that is boring.. ", + "sound_effect": "SNOR" + }, + { + "social_id": 42, + "button_name": "SCREAM", + "for_sender": "AAAAAAAAAAAAAHHH!!!! You scream loudly at %TARGETNAME%.. . maybe overreacting?", + "for_target": "AAAAAAAAAAAAAHHH!!!! %SENDERNAME% screams loudly at you.. . overreacting a bit!?", + "for_everyone": "AAAAAAAAAAAAAHHH!!!! %SENDERNAME% screams loudly at %TARGETNAME%.. . overreacting a bit?", + "sound_effect": "SCRM" + }, + { + "social_id": 43, + "button_name": "HIDE", + "for_sender": "You quickly hide in the shadows, hoping %TARGETNAME% does not see you. . .", + "for_target": "%SENDERNAME% quickly hides in the shadows, hoping you do not see them. . .", + "for_everyone": "%SENDERNAME% quickly hides in the shadows, hoping %TARGETNAME% does not see them. . .", + "sound_effect": null + }, + { + "social_id": 44, + "button_name": "TRIP", + "for_sender": "Poor %TARGETNAME% tripped over your giant hobbitty feet!!", + "for_target": "You tripped over %SENDERNAME%'s giant hobbitty feet!! Poor you!", + "for_everyone": "Poor %TARGETNAME% tripped over %SENDERNAME%'s giant hobbitty feet!!", + "sound_effect": null + }, + { + "social_id": 49, + "button_name": "ROAR", + "for_sender": "From the bottom of your being you release the loudest roar possible!. . Only. . on its way out, your voice squeaks a little, and that takes away from the intimidation. . . ", + "for_target": "From the bottom of %SENDERNAME%'s being they release the loudest roar possible towards you!. . Only. . on its way out, their voice squeaks a little, and that takes away from the intimidation. . . ", + "for_everyone": "From the bottom of %SENDERNAME%'s being they release the loudest roar possible towards %TARGETNAME%!. . Only. . on its way out, their voice squeaks a little, and that takes away from the intimidation. . . ", + "sound_effect": "ROAR" + }, + { + "social_id": 50, + "button_name": "BOO", + "for_sender": "BOOOOO! You frighten %TARGETNAME% really bad! They did not see that coming!", + "for_target": "BOOOOOOOO! %SENDERNAME% frightens you really bad! You did not see that coming!", + "for_everyone": "BOOOOO! %SENDERNAME% frightens %TARGETNAME% really bad! They did not see that coming!", + "sound_effect": "BOO" + } + ] + }, + { + "type": "HORSE", + "socials": [ + { + "social_id": 26, + "button_name": "WINK", + "for_sender": "Your horse winks at %TARGETNAME%.", + "for_target": "%SENDERNAME%'s horse winks at you!", + "for_everyone": "%SENDERNAME%'s horse winks at %TARGETNAME%.", + "sound_effect": null + }, + { + "social_id": 27, + "button_name": "NEIGH", + "for_sender": "Your horse neighs loudly at %TARGETNAME%.", + "for_target": "%SENDERNAME%'s horse neighs loudly at you.", + "for_everyone": "%SENDERNAME%'s horse neighs loudly at %TARGETNAME%.", + "sound_effect": null + }, + { + "social_id": 29, + "button_name": "WHINNY", + "for_sender": "Your horse whinnies softly and happily towards %TARGETNAME%.", + "for_target": "%SENDERNAME%'s horse whinnies softly and happily towards you.", + "for_everyone": "%SENDERNAME%'s horse whinnies softly and happily towards %TARGETNAME%.", + "sound_effect": null + }, + { + "social_id": 30, + "button_name": "SNORT", + "for_sender": "Your horse rudely snorts towards %TARGETNAME%!", + "for_target": "%SENDERNAME%'s horse rudely snorts towards you!", + "for_everyone": "%SENDERNAME%'s horse rudely snorts towards %TARGETNAME%!", + "sound_effect": null + }, + { + "social_id": 31, + "button_name": "BUCK", + "for_sender": "Your horse bucks you lightly. Must have been excited to see %TARGETNAME%.", + "for_target": "%SENDERNAME%'s horse bucks lightly. Must have been excited to see you.", + "for_everyone": "%SENDERNAME%'s horse bucks lightly. Must have been excited to see %TARGETNAME%.", + "sound_effect": null + } + ] + }, + { + "type": "GROUP", + "socials": [ + { + "social_id": 32, + "button_name": "HUG", + "for_sender": "You initiated a group hug!! It has risen the spirits of everyone involved!", + "for_target": "%SENDERNAME% initiated a group hug!! It has risen the spirits of everyone involved!", + "for_everyone": "%SENDERNAME% initiated a group hug!! It has risen the spirits of everyone involved!", + "sound_effect": null + }, + { + "social_id": 33, + "button_name": "DOG PILE", + "for_sender": "You yell DOGPILE! Suddenly everyone here has leapt on top of you, and you find yourself smothered at the bottom.", + "for_target": "%SENDERNAME% yells DOGPILE! Suddenly everyone here including you has leapt on top of %SENDERNAME%, smothering them at the bottom.", + "for_everyone": "%SENDERNAME% yells DOGPILE! Suddenly everyone here including you has leapt on top of %SENDERNAME%, smothering them at the bottom.", + "sound_effect": null + }, + { + "social_id": 34, + "button_name": "DANCE", + "for_sender": "You call everyone together for a ballet! Everyone here joins in.. You are the moon, another is the princess, and you're not sure what the others are supposed to be. . . ", + "for_target": "%SENDERNAME% calls everyone together for a ballet! Everyone here joins in.. %SENDERNAME% is the moon, another is the princess, and you're not sure what the others are supposed to be. . . ", + "for_everyone": "%SENDERNAME% calls everyone together for a ballet! Everyone here joins in.. %SENDERNAME% is the moon, another is the princess, and you're not sure what the others are supposed to be. . . ", + "sound_effect": null + }, + { + "social_id": 35, + "button_name": "HUDDLE", + "for_sender": "You call everyone for a huddle. You discuss your secret plans here.", + "for_target": null, + "for_everyone": "%SENDERNAME% has called a huddle. You all discuss your secret plans here.", + "sound_effect": null + }, + { + "social_id": 36, + "button_name": "HOWL", + "for_sender": "You howl at the moon loudly. Soon everyone here has joined in. The noise is intensely terrifying!", + "for_target": "%SENDERNAME% howls at the moon loudly. Soon you and everyone else here has joined in. The noise is intensely terrifying!", + "for_everyone": "%SENDERNAME% howls at the moon loudly. Soon you and everyone else here has joined in. The noise is intensely terrifying!", + "sound_effect": "HOWL" + } + ] + } + ], "arena":[ {"arena_id":1,"arena_type":"JUMPING","entry_cost":1000,"race_every":60,"slots":6,"timeout":2}, {"arena_id":2,"arena_type":"RACING","entry_cost":1000,"race_every":60,"slots":6,"timeout":2}, diff --git a/Horse Isle Server/HorseIsleServer/Game/Chat/SocialType.cs b/Horse Isle Server/HorseIsleServer/Game/Chat/SocialType.cs new file mode 100644 index 0000000..6e21d95 --- /dev/null +++ b/Horse Isle Server/HorseIsleServer/Game/Chat/SocialType.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HISP.Game.Chat +{ + public class SocialType + { + public SocialType(string type) + { + Socials = new List(); + Type = type; + SocialTypes.Add(this); + } + public static List SocialTypes = new List(); + public string Type; + public List Socials; + public class Social + { + public SocialType BaseSocialType; + + public int Id; + public string ButtonName; + public string ForSender; + public string ForTarget; + public string ForEveryone; + public string SoundEffect; + } + + public static Social GetSocial(int socialId) + { + foreach (SocialType sType in SocialTypes) + foreach (Social social in sType.Socials) + if (social.Id == socialId) + return social; + throw new KeyNotFoundException("Social " + socialId.ToString() + " not found!"); + } + public static SocialType GetSocialType(string type) + { + foreach (SocialType stype in SocialTypes) + if (stype.Type == type) + return stype; + throw new KeyNotFoundException("SocialType " + type + " NOT FOUND!"); + } + public static void AddNewSocial(string type, Social social) + { + foreach(SocialType stype in SocialTypes) + { + if(stype.Type == type) + { + social.BaseSocialType = stype; + stype.Socials.Add(social); + return; + } + } + SocialType sType = new SocialType(type); + social.BaseSocialType = sType; + sType.Socials.Add(social); + return; + } + } +} diff --git a/Horse Isle Server/HorseIsleServer/Game/Messages.cs b/Horse Isle Server/HorseIsleServer/Game/Messages.cs index 0eacffc..52a0344 100755 --- a/Horse Isle Server/HorseIsleServer/Game/Messages.cs +++ b/Horse Isle Server/HorseIsleServer/Game/Messages.cs @@ -13,6 +13,11 @@ namespace HISP.Game // Mod isle public static string ModIsleMessage; + // Socials + public static string SocialButton; + public static string SocialMessageFormat; + public static string SocialTypeFormat; + // Trading public static string TradeWithPlayerFormat; @@ -85,7 +90,6 @@ namespace HISP.Game // Player Interaction public static string PlayerHereMenuFormat; - public static string PlayerHereMulitpleMenuFormat; public static string PlayerHereProfileButton; public static string PlayerHereSocialButton; @@ -577,6 +581,8 @@ namespace HISP.Game public static string ViewBaiscStats; public static string ViewAdvancedStats; public static string HorseBuckedYou; + public static string HorseLlamaBuckedYou; + public static string HorseCamelBuckedYou; public static string HorseRidingMessageFormat; public static string HorseNameYoursFormat; @@ -905,6 +911,7 @@ namespace HISP.Game public static string BackToMapHorse; public static string LongFullLine; public static string MetaTerminator; + public static string R1; // Pawneer public static string PawneerUntackedHorsesICanBuy; @@ -985,7 +992,23 @@ namespace HISP.Game // Click public static string NothingInterestingHere; + // Socials + public static string FormatSocialButton(int socialId, string buttonName) + { + string id = "" + Convert.ToChar(0x21 + socialId); + return SocialButton.Replace("%ID%", id).Replace("%SOCIALNAME%", buttonName); + } + public static string FormatSocialMessage(string socialMsg, string targetName, string senderName) + { + return SocialMessageFormat.Replace("%SOCIALMSG%", socialMsg.Replace("%TARGETNAME%", targetName).Replace("%SENDERNAME%", senderName)); + } + public static string FormatSocialMenuType(string type) + { + return SocialTypeFormat.Replace("%TYPE%", Converters.CapitalizeFirstLetter(type.ToLower())); + } + // Trading + public static string FormatTradeYouReceived(int money) { return TradeYouReceivedMoneyMessageFormat.Replace("%MONEY%", money.ToString("N0", CultureInfo.InvariantCulture)); diff --git a/Horse Isle Server/HorseIsleServer/Game/Meta.cs b/Horse Isle Server/HorseIsleServer/Game/Meta.cs index 6473218..ca1f888 100755 --- a/Horse Isle Server/HorseIsleServer/Game/Meta.cs +++ b/Horse Isle Server/HorseIsleServer/Game/Meta.cs @@ -8,6 +8,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Drawing; +using HISP.Game.Chat; namespace HISP.Game { @@ -62,7 +63,14 @@ namespace HISP.Game } if(count >= 2) - playersHere += Messages.PlayerHereMulitpleMenuFormat; + { + SocialType stype = SocialType.GetSocialType("GROUP"); + foreach(SocialType.Social social in stype.Socials) + { + playersHere += Messages.FormatSocialButton(social.Id, social.ButtonName); + } + playersHere += Messages.R1; + } if (count <= 0) return ""; @@ -141,7 +149,7 @@ namespace HISP.Game message += Messages.ThingsIAmSelling; foreach (InventoryItem item in itemList) { - message += "^R1"; + message += Messages.R1; Item.ItemInformation itemInfo = Item.GetItemById(item.ItemId); int count = item.ItemInstances.Count; @@ -163,7 +171,7 @@ namespace HISP.Game } // Check whats avalilble to be sold - message += "^R1" + Messages.ThingsYouSellMe; + message += Messages.R1 + Messages.ThingsYouSellMe; InventoryItem[] shopperItemList = shopperInventory.GetItemList(); foreach (InventoryItem shopperitem in shopperItemList) @@ -179,14 +187,14 @@ namespace HISP.Game string countStr = count.ToString(); - message += "^R1"; + message += Messages.R1; message += Messages.FormatShopEntry(itemInfo.IconId, countStr, itemInfo.Name, shop.CalculateSellCost(itemInfo)); message += Messages.FormatSellButton(shopperitem.ItemInstances[0].RandomId); message += Messages.FormatSellAllButton(itemInfo.Id); message += Messages.FormatItemInformationButton(shopperitem.ItemInstances[0].RandomId); } - message += "^R1" + Messages.ExitThisPlace; + message += Messages.R1 + Messages.ExitThisPlace; return message; } @@ -363,7 +371,7 @@ namespace HISP.Game { message += Messages.NpcNoChatpoints; } - message += "^R1"; + message += Messages.R1; } return message; } @@ -445,6 +453,28 @@ namespace HISP.Game return message; } + public static string BuildSocialMenu(bool onHorse) + { + string message = ""; + foreach(SocialType sType in SocialType.SocialTypes) + { + if (sType.Type == "GROUP") + continue; + if (sType.Type == "HORSE") + if (!onHorse) + continue; + + message += Messages.FormatSocialMenuType(sType.Type); + foreach(SocialType.Social social in sType.Socials) + { + message += Messages.FormatSocialButton(social.Id, social.ButtonName); + } + message += Messages.R1; + } + message += Messages.BackToMap; + message += Messages.MetaTerminator; + return message; + } public static string BuildTradeAddItem(int totalItems) { @@ -1957,7 +1987,7 @@ namespace HISP.Game message += Messages.FormatItemThrowButton(randomId); message += Messages.FormatItemInformationButton(randomId); - message += "^R1"; + message += Messages.R1; } message += Messages.BackToMap; @@ -2101,7 +2131,7 @@ namespace HISP.Game } else { - message += "^R1"; + message += Messages.R1; } } diff --git a/Horse Isle Server/HorseIsleServer/Player/User.cs b/Horse Isle Server/HorseIsleServer/Player/User.cs index b28a7ed..8cde317 100755 --- a/Horse Isle Server/HorseIsleServer/Player/User.cs +++ b/Horse Isle Server/HorseIsleServer/Player/User.cs @@ -96,6 +96,7 @@ namespace HISP.Player public Highscore Highscores; public Riddler LastRiddle; public Award Awards; + public User SocializingWith; public int CapturingHorseId; public DateTime LoginTime; public string LastSeenWeather; diff --git a/Horse Isle Server/HorseIsleServer/Program.cs b/Horse Isle Server/HorseIsleServer/Program.cs index fcd0828..505f4f7 100755 --- a/Horse Isle Server/HorseIsleServer/Program.cs +++ b/Horse Isle Server/HorseIsleServer/Program.cs @@ -6,7 +6,6 @@ using HISP.Game.SwfModules; using HISP.Security; using HISP.Server; using HISP.Game.Services; - namespace HISP { public class Program diff --git a/Horse Isle Server/HorseIsleServer/Server/Database.cs b/Horse Isle Server/HorseIsleServer/Server/Database.cs index 540fc18..2cad5e8 100755 --- a/Horse Isle Server/HorseIsleServer/Server/Database.cs +++ b/Horse Isle Server/HorseIsleServer/Server/Database.cs @@ -1154,7 +1154,7 @@ namespace HISP.Server { db.Open(); MySqlCommand sqlCommand = db.CreateCommand(); - sqlCommand.CommandText = "INSERT INTO RiddlesComplete VALUES(@riddleId, @playerId, \"YES\")"; + sqlCommand.CommandText = "INSERT INTO RiddlesComplete VALUES(@playerId, @riddleId, \"YES\")"; sqlCommand.Parameters.AddWithValue("@riddleId", riddleId); sqlCommand.Parameters.AddWithValue("@playerId", playerId); sqlCommand.Prepare(); diff --git a/Horse Isle Server/HorseIsleServer/Server/GameClient.cs b/Horse Isle Server/HorseIsleServer/Server/GameClient.cs index 9acc126..a9f19af 100755 --- a/Horse Isle Server/HorseIsleServer/Server/GameClient.cs +++ b/Horse Isle Server/HorseIsleServer/Server/GameClient.cs @@ -408,6 +408,9 @@ namespace HISP.Server case PacketBuilder.PACKET_PLAYER_INTERACTION: GameServer.OnPlayerInteration(this, Packet); break; + case PacketBuilder.PACKET_SOCIALS: + GameServer.OnSocialPacket(this, Packet); + break; default: Logger.ErrorPrint("Unimplemented Packet: " + BitConverter.ToString(Packet).Replace('-', ' ')); break; diff --git a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs index 4b7c3ba..2405bd7 100755 --- a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs +++ b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs @@ -793,6 +793,28 @@ namespace HISP.Server Logger.DebugPrint("Registered Leaser: " + leaser.LeaseId.ToString() + " For a " + leaser.HorseName); } + // Register Socials + int totalSocials = gameData.social_types.Count; + for (int i = 0; i < totalSocials; i++) + { + string socialType = gameData.social_types[i].type; + int totalSocialsOfType = gameData.social_types[i].socials.Count; + for (int ii = 0; ii < totalSocialsOfType; ii++) + { + SocialType.Social social = new SocialType.Social(); + + social.Id = gameData.social_types[i].socials[ii].social_id; + social.ButtonName = gameData.social_types[i].socials[ii].button_name; + social.ForSender = gameData.social_types[i].socials[ii].for_sender; + social.ForTarget = gameData.social_types[i].socials[ii].for_target; + social.ForEveryone = gameData.social_types[i].socials[ii].for_everyone; + social.SoundEffect = gameData.social_types[i].socials[ii].sound_effect; + + SocialType.AddNewSocial(socialType, social); + Logger.DebugPrint("Registered Social: " + social.ButtonName); + } + } + HorseInfo.HorseNames = gameData.horses.names.ToObject(); Item.Present = gameData.item.special.present; @@ -825,6 +847,11 @@ namespace HISP.Server Map.ModIsleX = gameData.messages.commands.mod_isle.x; Map.ModIsleY = gameData.messages.commands.mod_isle.y; + // Socials + Messages.SocialButton = gameData.messages.meta.player_interaction.socials.socials_button; + Messages.SocialMessageFormat = gameData.messages.meta.player_interaction.socials.socials_message; + Messages.SocialTypeFormat = gameData.messages.meta.player_interaction.socials.socials_menu_type; + // Trade Messages.TradeWithPlayerFormat = gameData.messages.meta.player_interaction.trade.trading_with; @@ -898,7 +925,6 @@ namespace HISP.Server // Player Interation Messages.PlayerHereMenuFormat = gameData.messages.meta.player_interaction.menu; - Messages.PlayerHereMulitpleMenuFormat = gameData.messages.meta.player_interaction.multiple_players_menu; Messages.PlayerHereProfileButton = gameData.messages.meta.player_interaction.profiile_button; Messages.PlayerHereSocialButton = gameData.messages.meta.player_interaction.social_button; @@ -1382,6 +1408,8 @@ namespace HISP.Server Messages.ViewBaiscStats = gameData.messages.meta.horse.view_basic_stats; Messages.ViewAdvancedStats = gameData.messages.meta.horse.view_advanced_stats; Messages.HorseBuckedYou = gameData.messages.meta.horse.horse_bucked; + Messages.HorseLlamaBuckedYou = gameData.messages.meta.horse.llama_bucked; + Messages.HorseCamelBuckedYou = gameData.messages.meta.horse.camel_bucked; Messages.HorseRidingMessageFormat = gameData.messages.meta.horse.riding_message; Messages.HorseNameYoursFormat = gameData.messages.meta.horse.horse_inventory.your_horse_format; @@ -1663,8 +1691,11 @@ namespace HISP.Server Messages.NoPitchforkMeta = gameData.messages.meta.hay_pile.no_pitchfork; Messages.HasPitchforkMeta = gameData.messages.meta.hay_pile.pitchfork; - + Messages.R1 = gameData.messages.meta.r1; Messages.PasswordEntry = gameData.messages.meta.password_input; + + // Venus Fly Trap + Messages.VenusFlyTrapFormat = gameData.messages.meta.venus_flytrap_format; // Shortcut diff --git a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs index c088675..ec0884e 100755 --- a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs +++ b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs @@ -321,7 +321,8 @@ namespace HISP.Server } catch(FormatException) { - Logger.InfoPrint(sender.LoggedinUser.Username + " tried to trade with User ID NaN."); + Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to trade with User ID NaN."); + break; } if(IsUserOnline(playerId)) { @@ -354,6 +355,105 @@ namespace HISP.Server } return; } + public static void OnSocialPacket(GameClient sender, byte[] packet) + { + if (!sender.LoggedIn) + { + Logger.ErrorPrint(sender.RemoteIp + " Tried to be socialable, but has no account and therefor no friends."); + return; + } + byte method = packet[1]; + + switch (method) + { + case PacketBuilder.SOCIALS_MENU: + string packetStr = Encoding.UTF8.GetString(packet); + string playerIdStr = packetStr.Substring(2, packetStr.Length - 4); + int playerId = -1; + try + { + playerId = int.Parse(playerIdStr); + } + catch (FormatException) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to socialize with User ID NaN."); + break; + } + + if(IsUserOnline(playerId)) + { + sender.LoggedinUser.SocializingWith = GetUserById(playerId); + sender.LoggedinUser.MetaPriority = true; + byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildSocialMenu(sender.LoggedinUser.CurrentlyRidingHorse != null)); + sender.SendPacket(metaPacket); + } + else + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " tried to socialize with User #"+playerId.ToString()+" but there not online."); + } + break; + case PacketBuilder.SOCIALS_USE: + int socialId = Convert.ToInt32(packet[2] - (byte)0x21); + SocialType.Social social = SocialType.GetSocial(socialId); + + foreach(User user in GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, true)) + { + if (social.BaseSocialType.Type != "GROUP") + if (user.Id == sender.LoggedinUser.SocializingWith.Id) + continue; + + if (user.Id == sender.LoggedinUser.Id) + continue; + + if (user.MuteAll || user.MuteSocials) + continue; + + byte[] msgEveryone = PacketBuilder.CreateChat(Messages.FormatSocialMessage(social.ForEveryone, sender.LoggedinUser.SocializingWith.Username, sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_RIGHT); + user.LoggedinClient.SendPacket(msgEveryone); + } + if(social.ForTarget != null) + { + if(sender.LoggedinUser.SocializingWith != null) + { + if (social.BaseSocialType.Type != "GROUP") + { + if (!sender.LoggedinUser.SocializingWith.MuteAll || !sender.LoggedinUser.SocializingWith.MuteSocials) + { + byte[] msgTarget = PacketBuilder.CreateChat(Messages.FormatSocialMessage(social.ForTarget, sender.LoggedinUser.SocializingWith.Username, sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.LoggedinUser.SocializingWith.LoggedinClient.SendPacket(msgTarget); + } + } + } + } + if(social.ForSender != null) + { + if (sender.LoggedinUser.SocializingWith != null) + { + byte[] msgSender = PacketBuilder.CreateChat(Messages.FormatSocialMessage(social.ForSender, sender.LoggedinUser.SocializingWith.Username, sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(msgSender); + + } + } + + foreach(User user in GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, true)) + { + if (social.SoundEffect != null) + { + if (user.MuteAll || user.MuteSocials) + continue; + + byte[] soundEffect = PacketBuilder.CreatePlaysoundPacket(social.SoundEffect); + user.LoggedinClient.SendPacket(soundEffect); + } + } + + break; + default: + Logger.ErrorPrint(sender.LoggedinUser.Username + " unknown social: " + method.ToString("X") + " packet dump: " + BitConverter.ToString(packet).Replace("-", " ")); + break; + } + + } public static void OnBirdMapRequested(GameClient sender, byte[] packet) { if (!sender.LoggedIn) @@ -3960,9 +4060,16 @@ namespace HISP.Server if(GameServer.RandomNumberGenerator.Next(0, 100) >= 97 || sender.LoggedinUser.Username.ToLower() == "dream") { loggedInUser.CurrentlyRidingHorse.BasicStats.Experience++; + byte[] horseBuckedMessage; + if(loggedInUser.CurrentlyRidingHorse.Breed.Type == "llama") + horseBuckedMessage = PacketBuilder.CreateChat(Messages.HorseLlamaBuckedYou, PacketBuilder.CHAT_BOTTOM_RIGHT); + else if (loggedInUser.CurrentlyRidingHorse.Breed.Type == "camel") + horseBuckedMessage = PacketBuilder.CreateChat(Messages.HorseCamelBuckedYou, PacketBuilder.CHAT_BOTTOM_RIGHT); + else + horseBuckedMessage = PacketBuilder.CreateChat(Messages.HorseBuckedYou, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.LoggedinUser.CurrentlyRidingHorse = null; sender.LoggedinUser.Facing %= 5; - byte[] horseBuckedMessage = PacketBuilder.CreateChat(Messages.HorseBuckedYou, PacketBuilder.CHAT_BOTTOM_RIGHT); sender.SendPacket(horseBuckedMessage); } } diff --git a/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs b/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs index 577eb6f..05f222e 100755 --- a/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs +++ b/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs @@ -51,6 +51,10 @@ namespace HISP.Server public const byte PACKET_SWFMODULE = 0x50; public const byte PACKET_AUCTION = 0x24; public const byte PACKET_PLAYER_INTERACTION = 0x2A; + public const byte PACKET_SOCIALS = 0x5A; + + public const byte SOCIALS_MENU = 0x14; + public const byte SOCIALS_USE = 0x15; public const byte PLAYER_INTERACTION_TRADE = 0x28; public const byte PLAYER_INTERACTION_ADD_ITEM = 0x29;