GMCP documentation

SsalissSsaliss Member Posts: 3,575 Transcendent
edited September 2015 in Mechanic's Corner
The question was raised earlier on a clan, and the current GMCP doc is rather outdated, so I figured I'd take a stab at documenting it a bit. Please note that this is completely unofficial, and may contain inaccuracies, but if an error is found I'll gladly edit and update this guide. Further, this guide will only document the messages themselves, and not how to get GMCP working (since that is client dependent). I'll list the messages alphabetically (so Char.Afflictions.Add first, and Room.Wrongdir last) to make it a bit easier to find what you're looking for.

  • Char.Afflictions.Add
    • Contains the following values:
      • name: The short name of the affliction (i.e. "paralysis")
      • cure: The method of curing (i.e. "eat puritydust")
      • desc: A description of what the affliction does (i.e. "Paralysis will freeze the muscles in your body, making many actions impossible until it is cured.")
    • This one fires whenever you get an affliction. Note, however, that if you get hit by an unknown affliction, this does not fire, and it only fires on overhauled afflictions.
  • Char.Afflictions.List
    • Contains a list of afflictions. The values of each affliction mirrors the values above.
    • This one fires whenever you use DIAG or FIRSTAID or similar, and it only contains overhauled afflictions. It is also sent once on login.
  • Char.Afflictions.Remove
    • Contains a single value with the affliction removed.
    • This will fire whenever an affliction is removed. Note that this only fires if it is an overhauled affliction.
  • Char.Defences.Add
    • Contains the following values:
      • name: The short name of the defence (i.e. "waterwalk")
      • desc: A description of what the defence does (i.e. "Water walking allows you to travel across water without the need for swimming.")
    • This one fires whenever you put up a new defence. Note that this only fires on overhauled defences.
  • Char.Defences.List
    • Contains a list of defences. The values of each affliction mirrors the values above.
    • This one fires whenever you check DEF. Note that the only defences contained in the list are overhauled defences. It is also sent once on login.
  • Char.Defences.Remove
    • Contains a single value with the defence removed.
    • This one fires whenever a defence is removed from you. Note that it only fires on overhauled defences.
  • Char.Items.Add
    • Contains the following values:
      • location: Where the item is added. Most commonly "room" or "inv", but can also have other values (such as containers).
      • item: A dataset with the following values:
        • id: The numerical ID of the item (as seen on II etc)
        • name: The short appearance of the item (i.e. "a wafer of purity dust")
        • icon: What kind of item it is (I only noticed it while writing this, but among the values are "commodity", "fiend", "pet", "container" and "lamp". I'll see if I can get more item types)
        • attrib: The attributes of an item. This has never been explained fully, but these are the best guesses I've seen so far:
          • e: Edible
          • g: Groupable
          • t: Takeable (i.e. not fixed in the room)
          • m: Mobile
          • c: Container
    • This fires whenever an item is added to the room
  • Char.Items.List
    • Contains the following values:
      • location: Where the items are. Most commonly "room" or "inv", but can also have other values (such as containers).
      • items: A list of items. The structure and values mirror that of the item dataset mentioned above.
    • This one fires in various ways:
      • A list of items in the room is sent every time you LOOK or QL in a room. If you move around, this is done automatically, but it doesn't happen if you follow someone.
      • A list of items in your inventory is sent in response to you sending Char.Items.Inv to the server.
      • A list of items in a container is sent in response to you sending Char.Items.Contents <ID> to the server.
  • Char.Items.Remove
    • Contains the exact same values as Char.Items.Add.
    • This is sent whenever an item is removed. When transferring items from one place to another (getting, dropping, putting) first a Char.Items.Remove is sent, followed by a Char.Items.Add.
  • Char.Items.Update
    • Contains the exact same values as Char.Items.Add.
    • This is sent whenever an item is changed. Most often, this happens when groups are manipulated (splitting, combining, etc).
  • Char.Name
    • Contains the following values:
      • name: The name of your character.
      • fullname: Includes titles and family name.
    • This is sent on login. It is NOT sent when titles are changed.
  • Char.Skills.Groups
    • Contains a list of the following values:
      • name: The name of the skill (i.e. "Combat")
      • rank: The rank (i.e. "Expert")
    • This is sent in response to you sending Char.Skills.Get to the server.
  • Char.Skills.List
    • Contains the following values:
      • group: The skill in question (i.e. "aethercraft")
      • list: A list containing the skill names.
      • descs: A list containing the skill descriptions.
    • The list and descs are matched. Thus, the first entry in descs is a description of the first entry in list, and so on.
    • This is sent in response to you sending Char.Skills.Get with a "group" value (i.e. Char.Skills.Get { "group": "aethercraft"} )
  • Char.Skills.Info
    • Contains the following values:
      • group: The skill in question (i.e. "aethercraft")
      • skill: The individual ability (i.e. "targeting")
      • info: The AB entry. Newlines are sent as \n
    • This is sent in response to you sending Char.Skills.Info with a "group" and a "name" value (i.e. Char.Skills.Get { "group": "aethercraft", "name": "targeting" } )
  • Char.Status
    • Contains the following values:
      • fullname: Your full name, including titles and family name.
      • level: The name of your level (i.e. "Demigod")
      • xprank: Your numerical ranking, or "unranked" if you're not yet ranked. Contains an ending, i.e. "100th".
      • explorerrank: Your explorer ranking in text, i.e. "a Cosmic Wayfarer"
      • race: Your race. Demigod counts as a race. Uncertain how it deals with racehats.
      • age: Your age. If your age has been adjusted, this shows your adjusted age.
      • guild: Your guild and guild title (i.e. "Shadowdancers (within Mother Night's Entourage)")
      • city: Your org and org title (i.e. "Glomdoring (Shadow Warden)")
      • order: Presumably the same as above, but I'm not in an order. Contains "none" if you're not in an Order.
      • family: Your family name.
      • gold: How much gold you have on you, including containers.
      • bank: How much gold you have in banks.
      • unread_msgs: How many messages you have that are unread.
      • unread_news: How many news articles you have that are unread.
      • gender: Your gender.
    • This is sent on login, and a subset is sent whenever a value changes (so when you pick up some gold, you get Char.Status with only a "gold" value)
  • Char.StatusVars
    • Contains the values above, with a short descriptor (in most cases simply a capitalised version).
    • This is sent on login.
  • Char.Vitals
    • Contains the following values:
      • hp: Your current health
      • maxhp: Your maximum health
      • mp: Your current mana
      • maxmp: Your maximum mana
      • ego: Your current ego
      • maxego: Your maximum ego
      • pow: Your current power
      • maxpow: Your maximum power (always 10, presumably)
      • reserves: Your current reserves
      • ep: Your current ndurance
      • maxep: Your maximum endurance
      • wp: Your current willpower
      • maxwp: Your maximum willpower
      • essence: Your current essence (if you're a demigod)
      • nl: Progress to the next level (if you're not a demigod)
      • awp: Your current aetherwill
      • maxawp: Your maximum aetherwill
      • esteem: Your current esteem
      • karma: Your current karma
      • blind: If you're blind or not
      • deaf: If you're deaf or not
      • prone: If you're prone or not
      • kafe: If you've got the kafe defence or not
      • momentum: Your current momentum
      • beastbal: If your beast has balance
      • mount: What you're mounted on
      • equilibrium: If you've got equilibrium
      • balance: If you've got balance
      • head: If you've got balance on your head
      • left_arm: If you've got balance on your left arm
      • right_arm: If you've got balance on your right arm
      • right_leg: If you've got balance on your right leg
      • left_leg: If you've got balance on your left leg
      • psisub: If you've got balance on the sub channel (if you have the channel locked, -1)
      • psisuper: If you've got balance on the super channel (if you have the channel locked, -1)
      • psiid: If you've got balance on the id channel (if you have the channel locked, -1)
      • modulebal: A new addition, presumably if you've got balance on an aethership module, or -1 if not locked in
      • string: A string representation of some of the above abilities. It follows the same syntax as the old ATCP channel, so presumably there for backwards compability
      • charstats: A list of strings with representations of some of the above values (for the moment, reserves, karma and esteem)
    • This is sent on every prompt. If you're blacked out, the appropriate values are set to 0 (health, mana, ego etc)
  • Comm.Channel.Text
    • Contains the following values:
      • channel: The channel in question (i.e. "market")
      • talker: The name of the speaker
      • text: What is said, including colour codes
    • This is sent whenever something is said on a channel.
  • Comm.Channel.Start
    • Contains a single value with the short name of the channel (i.e. "market")
    • This is sent whenever something is said on a channel, right before the text is sent.
  • Comm.Channel.End
    • Contains a single value with the short name of the channel (i.e. "market")
    • This is sent whenever something is said on a channel, right after the text is sent.
  • Comm.Channel.List
    • Contains a list of the following values:
      • name: The short name of the channel
      • caption: The longer name of the channel
      • command: How to speak on the channel
    • This is sent on login. It is also sent when your channel list changes, i.e. when joining or leaving clans etc.
  • Comm.Channel.Players
    • Contains a list of the following values:
      • name: The name of the player
      • channels: A list of what channels you share. If no channels are shared, this is omitted.
    • This is sent in response to you sending Comm.Channel.Players to the server.
    • The list of players include those off-plane if you share orgs, but it seems not to if you share a clan. Otherwise, it only lists those on Prime without a gem.
  • Core.Goodbye
    • Contains a single string with a logout message (generally "Farewell, adventurer.").
    • Only sent on logout, or if you're disconnected by the server.
  • Core.Ping
    • Sent in response to you sending Core.Ping to the server. No values.
  • IRE.Misc.Achievement
    • Contains the following values:
      • name: The name of the value changed (i.e. "TotalCreaturesKilled")
      • value: The new value
    • This is sent when those values are changed. I'm not aware of a way to get a full list of achievement values.
  • IRE.Misc.RemindVote
  • IRE.Rift.Change
    • Contains the following values:
      • name: The name of the rift item changing (i.e. "yarrow")
      • amount: The new amount
      • desc: A description of the item (i.e. "normal: a yarrow sprig"). Other than normal, I've confirmed "liquid", but presumably there's also types for flesh, tarot cards etc.
    • This is sent whenever the rift changes.
  • IRE.Rift.List
    • Contains a list with the values mentioned above.
    • This is sent in response to you sending IRE.Rift.Request to the server.
  • Room.AddPlayer
    • Contains the following values:
      • name: The name of the player
      • fullname: Includes titles and family name
    • This is sent whenever someone visible enters the room. If you're shrouded, you're not announced this way.
  • Room.Info
    • Contains the following values:
      • num: The ID of the room
      • name: The name of the room
      • desc: The verbose description of the room
      • area: The area the room is in
      • environment: The environment of the room (this ignores, IIRC, illusory terrain, unlike Survey)
      • coords: The coordinates of the room
      • map: The URL of the map of the area
      • details: A list of strings with room flags (i.e. "the Prime Material Plane", "indoors", etc)
      • exits: A dataset containing the directions of the exits mapped to the room IDs of the next room (i.e. "u": "1337")
    • This is sent whenever you enter a room.
  • Room.Players
    • Contains a list with the following values:
      • name: The name of the player
      • fullname: Includes titles and family name
    • This is sent whenever you enter a room or look in a room. It only lists players you can actually see; if you don't have thirdeye, you won't see shrouded players here either.
  • Room.RemovePlayer
    • Contains the name of the player who just left the room.
    • This is sent whenever someone leaves the room. As with the rest, this only shows players that you see leaving. If they are shrouded, this won't fire.
  • Room.WrongDir
    • Contains a single value with the direction.
    • This is sent whenever you fail to move rooms due to there not being an exit in that direction.

If there's anything here you want to add, or have questions about, etc. just post below!

image
Post edited by Ssaliss on
«1

Comments

  • AeldraAeldra , using cake powered flight Member Posts: 1,166 Transcendent
    Thank you for taking the time to documenting this. I'm sure it'll help many people (including myself) to make better use of GMCP.
    Avatar / Picture done by Xeii. Wheeeeee 
  • DaraiusDaraius Shevat The juror's taco spotMember Posts: 4,469 Transcendent
    Yes, so helpful. Thank you. :D
  • ShaddusShaddus , the Leper Messiah Outside your window.Member Posts: 8,140 Transcendent
    Is there a gmcp for when any person logs into Lusternia that can show you logins and logouts?
    Everiine said: The reason population is low isn't because there are too many orgs. It's because so many facets of the game are outright broken and protected by those who benefit from it being that way. An overabundance of gimmicks (including game-breaking ones), artifacts that destroy any concept of balance, blatant pay-to-win features, and an obsession with convenience that makes few things actually worthwhile all contribute to the game's sad decline.
  • SsalissSsaliss Member Posts: 3,575 Transcendent
    Nope. Closest you can get is to use the player-list regularly.
    image
  • SyrenniaSyrennia Member Posts: 249 Gifted
    edited September 2015
    Only way you can check that via events, is if you use the webclient. There's a js thing to retrieve that kinda stuff... If you could do it in Mudlet, you could check with hidden people came around, so yeah...

    edit; last I checked, it fired on hidden people with java.. so I'm only assuming.
    image
  • SsalissSsaliss Member Posts: 3,575 Transcendent
    Syrennia said:
    Only way you can check that via events, is if you use the webclient. There's a js thing to retrieve that kinda stuff... If you could do it in Mudlet, you could check with hidden people came around, so yeah...

    edit; last I checked, it fired on hidden people with java.. so I'm only assuming.
    Could you expand on that a bit? What "js thing" lets you retrieve it?
    image
  • SyrenniaSyrennia Member Posts: 249 Gifted
    js = javascript. 

    I can't say more than 'thing' because I forget exactly what it's called. It was a hook type thing, that retrieved game data. Remember someone in Achaea mentioning it, as a means to see how many different people logged in each day, and for approx. how long per day, as some experiment. Same client, so I imagine the exact same would be possible in Lusternia.
    image
  • AkyaevinAkyaevin Member Posts: 586 Fabled
    There is a json api which gives a list of characters logged in. It does not report characters with gems, and may not report characters off prime (I can't remember).

    There is a separate, more hidden page which provides the info to the feed on the Lusternia.com page. I don't think it reports logging in or out any more.
  • SsalissSsaliss Member Posts: 3,575 Transcendent
    edited September 2015
    Yeah, I know about that API. It can be found at http://api.lusternia.com/characters.json and is more or less exactly what you get from the GMCP Comm.Players.List call (I think the API includes people in the intro, where GMCP does not; I can't recall any other differences off-hand).

    EDIT: Hmm. It seems there's some difference... Need to dig into this. Might be that the API only excludes people with gems. Interesting...

    EDIT EDIT: Yep, seems so. I got Avurekhos (in a manse) via the API, but don't get him through GMCP. Bug? Feature? Only @Ieptix might know...
    image
  • SaranSaran Member Posts: 2,183 Transcendent
    Just for reasons, does anyone know if any gmcp stuff fires when you "probe" mobs?
    image
    image
  • SsalissSsaliss Member Posts: 3,575 Transcendent
    Nope, no GMCP message like that.
    image
  • SaranSaran Member Posts: 2,183 Transcendent
    Damn, oh well, resistance analyser nearly done with just triggers anyway
    image
    image
  • SsalissSsaliss Member Posts: 3,575 Transcendent
    Added in Char.Skills.Info
    image
  • ShaddusShaddus , the Leper Messiah Outside your window.Member Posts: 8,140 Transcendent
    If I had more knowledge in how to use these, I'd make up a packaged module for Mudlet for basic things like picking up essence when it drops and you regain balance.
    Everiine said: The reason population is low isn't because there are too many orgs. It's because so many facets of the game are outright broken and protected by those who benefit from it being that way. An overabundance of gimmicks (including game-breaking ones), artifacts that destroy any concept of balance, blatant pay-to-win features, and an obsession with convenience that makes few things actually worthwhile all contribute to the game's sad decline.
  • SsalissSsaliss Member Posts: 3,575 Transcendent
    If anyone wants to do this (I don't use Mudlet, so I can't help you much), my suggestion is to set a flag to true when you get the IRE.Misc.Achievement event and set it to false on the Char.Vitals event. Create a trigger to the Char.Item.Add event that adds the items added to a pickup list if that flag is set to true. If you've got stratagems, it's dead simple; just use SM INSERT FREE GET <item> to autopickup when you get balance back. This will pick up everything that drops when you kill something, including gold (although if there's already gold in the room, it doesn't pick any gold up).
    image
  • ShaddusShaddus , the Leper Messiah Outside your window.Member Posts: 8,140 Transcendent
    I usually make a trigger for stratagems to pick up gold/essence for my characters, but I can't always afford to use a few hundred lessons just to get Stratagems.
    Everiine said: The reason population is low isn't because there are too many orgs. It's because so many facets of the game are outright broken and protected by those who benefit from it being that way. An overabundance of gimmicks (including game-breaking ones), artifacts that destroy any concept of balance, blatant pay-to-win features, and an obsession with convenience that makes few things actually worthwhile all contribute to the game's sad decline.
  • SyrenniaSyrennia Member Posts: 249 Gifted
    1) Make a script with the event of gmcp.Char.Vitals.
    2) if gmcp.Char.Vitals.balance == '1' and gmcp.Char.Vitals.equilibrium == '1' and not grab_attempt then
          for i,v in pairs(gmcp.Char.Items.List) do
             if string.find(v.name, "essence") then
                grab_attempt = true
                send("get essence",false)
                tempTimer(1, [[grab_attempt = false]])
                return
             end
          end
       end

    Something like that, if I remember correctly. I may have missed something, but I'm doing it completely from memory as I don't have access to mudlet right now. I know the bashing script on the forums has essence grabbing, the one Rialorm (formerly Chade) manages.
     
    image
  • AeldraAeldra , using cake powered flight Member Posts: 1,166 Transcendent
    Syrennia said:
    1) Make a script with the event of gmcp.Char.Vitals.
    2) if gmcp.Char.Vitals.balance == '1' and gmcp.Char.Vitals.equilibrium == '1' and not grab_attempt then
          for i,v in pairs(gmcp.Char.Items.List) do
             if string.find(v.name, "essence") then
                grab_attempt = true
                send("get essence",false)
                tempTimer(1, [[grab_attempt = false]])
                return
             end
          end
       end

    Something like that, if I remember correctly. I may have missed something, but I'm doing it completely from memory as I don't have access to mudlet right now. I know the bashing script on the forums has essence grabbing, the one Rialorm (formerly Chade) manages.
     
    eh, good start, but not quite. gmcp.char.items.list can contain the items in the room as well. You do want to fire a gmcp.char.items.inv to the server using sendGMCP first, then do trigger on that to do your scanning. At least in my tests, it always had room info (gmcp.char.items.list.location being "room" ), because that's updated every move/look
    Avatar / Picture done by Xeii. Wheeeeee 
  • SynkarinSynkarin Nothing to see here Member Posts: 3,216 Transcendent
    edited September 2015
    Aeldra said:
    Syrennia said:
    1) Make a script with the event of gmcp.Char.Vitals.
    2) if gmcp.Char.Vitals.balance == '1' and gmcp.Char.Vitals.equilibrium == '1' and not grab_attempt then
          for i,v in pairs(gmcp.Char.Items.List) do
             if string.find(v.name, "essence") then
                grab_attempt = true
                send("get essence",false)
                tempTimer(1, [[grab_attempt = false]])
                return
             end
          end
       end

    Something like that, if I remember correctly. I may have missed something, but I'm doing it completely from memory as I don't have access to mudlet right now. I know the bashing script on the forums has essence grabbing, the one Rialorm (formerly Chade) manages.
     
    eh, good start, but not quite. gmcp.char.items.list can contain the items in the room as well. You do want to fire a gmcp.char.items.inv to the server using sendGMCP first, then do trigger on that to do your scanning. At least in my tests, it always had room info (gmcp.char.items.list.location being "room" ), because that's updated every move/look

    I think you're a bit confused on what the intention here is, he's not looking at his inventory, he's looking at the items in a room to see if there is essence to grab. You're right in how you need to check an inventory, because inv list isn't updated a lot. 

    Really, the gmcp event that you need to use are 'gmcp.Char.Item.Add' to grab stuff after you kill something

    Everiine said:
    "'Cause the fighting don't stop till I walk in."
    -Synkarin's Lament.
  • AeldraAeldra , using cake powered flight Member Posts: 1,166 Transcendent
    oops. Yep, you are right, I thought he was looking into the inventory, not the room. Then you are, of course correct.
    Avatar / Picture done by Xeii. Wheeeeee 
  • ShaddusShaddus , the Leper Messiah Outside your window.Member Posts: 8,140 Transcendent
    Actually, all I wanted to do was trigger off an essence dropping line to pick up essence if I regain bal/eq.
    Everiine said: The reason population is low isn't because there are too many orgs. It's because so many facets of the game are outright broken and protected by those who benefit from it being that way. An overabundance of gimmicks (including game-breaking ones), artifacts that destroy any concept of balance, blatant pay-to-win features, and an obsession with convenience that makes few things actually worthwhile all contribute to the game's sad decline.
  • TarkentonTarkenton Traitor Bear Member Posts: 2,555 Transcendent
    edited February 2016
    Played with IRE.Target a bit.

    This is all from the Mudlet pov, for other clients, you'll have to handle the sending gmcp stuff yourself and what not.
    First, gotta add IRE.Target to what Lusternia kicks back to you.

    sendGMCP([[Core.Supports.Add ["IRE.Target 1"] ]])

    That activates the target dealie. You can see the information with mudlet using

    display(gmcp.IRE.Target)

    Now, for the important part, setting your target.


    sendGMCP([[IRE.Target.Set "MOBNUMBER" ]])

    That will populate gmcp.IRE.Target, giving you output such as

    {
      Info = {
        short_desc = "the corpse of a prim and proper butler",
        hpperc = "0",
        id = "194836"
      }
    }

    or

    {
      Info = {
        short_desc = "a prim and proper butler",
        hpperc = "100",
        id = "194836"
      }
    }

    Something to note is that to update the HP value of the target after attacking it, you need to send the target command again, else it'll just keep saying 100 after you target them. Now go forth, and track that mob HP.

    Edit: So, discovered an interesting thing. IRE.Target doesn't seem to update when you set the target again, but rather when there's a fresh update from some other gmcp module. However, if you don't retarget, it doesn't shoot you the updated hpperc.
    Post edited by Tarkenton on
    image
  • HavastusHavastus Member Posts: 346 Expert
    That seems broken...

  • TarkentonTarkenton Traitor Bear Member Posts: 2,555 Transcendent
    Agreed. Hence posting about it. Think I submitted a bug report about it, I'll check later to make sure.
    image
  • SsalissSsaliss Member Posts: 3,575 Transcendent
    edited February 2016
    Tarkenton said:
    Edit: So, discovered an interesting thing. IRE.Target doesn't seem to update when you set the target again, but rather when there's a fresh update from some other gmcp module. However, if you don't retarget, it doesn't shoot you the updated hpperc.
    It updates properly when I set the target again without needing another module firing, but I don't use Mudlet. Doesn't seem to be broken on the Lusternia side (unless it's got something to do with MCCP or something; I think Mudlet has that on by default)
    image
  • TarkentonTarkenton Traitor Bear Member Posts: 2,555 Transcendent
    Out of curiosity, is this with a mob wailing on you after smacking it?
    image
  • SsalissSsaliss Member Posts: 3,575 Transcendent
    Nope. I basically went and found a mob and changed my pinger (which normally sends Core.Ping every second) to instead set a target. I got the target data every second, without any kind of output inbetween. Just a constant stream of IRE.Target.Info.

    Unless you meant that the HP value of it doesn't change until other things do. I never tested that, I guess.
    image
  • TarkentonTarkenton Traitor Bear Member Posts: 2,555 Transcendent
    That, and I ran into the issue that if I changed targets, it didn't update until I changed rooms, vitals changed, etc.
    image
  • SsalissSsaliss Member Posts: 3,575 Transcendent
    Do you know if you've got MCCP enabled in Mudlet? (I think it's called MCCP; the compression thing).
    image
  • TarkentonTarkenton Traitor Bear Member Posts: 2,555 Transcendent
    Not sure. I'll have to check when I get home tonight.
    image
Sign In or Register to comment.