{"action":"created","comment":{"url":"https://api.github.com/repos/wurstscript/WurstStdlib2/pulls/comments/216342178","pull_request_review_id":153799894,"id":216342178,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxNjM0MjE3OA==","diff_hunk":"@@ -0,0 +1,386 @@\n+package DamageModify\n+import DamageDetection\n+import LinkedList\n+import DamageType\n+/*\n+\tThe main objective of this system is to have same damage event-related object at all stages of damage event.\n+\tIt implements `Damage` class which contains all arguments of `UnitDamageTarget` native plus one integer for additional attachments.\n+\tFeatures custom instance lifetime.\n+\tCallbacks have Damage instance as an argument.\n+\n+\tDamage instance can be created before damage invokation, thus it can be modified anyhow before the event.\n+\tIt is guaranteed to be passed to modifiers and listeners during the event invoked through `.deal()` method.\n+\tAnd then the instance is still accessable (in case it was saved), allowing user to easily retrieve event data.\n+\n+\tSystem is guaranteed to work as in documentation only if there's no listeners in DamageDetection after this package's one.\n+\tThe system does not handle 0 damage events.\n+\t\n+\tHas several cases of possibly unexpected behavior:\n+\t- Actual amount can not go below zero or above target's HP.\n+\t- Event Damage is set to .actualAmount, not .amount.\n+\t- Damage instance can not be modified from inside listeners.\n+\n+\tThere will be output to debug log stream if anything would go wrong,\n+\tfor example if system will fail to pass/catch Damage instance in between\n+\tdamage instance creation and it's handling (.deal() and .handle()).\n+\t\n+\tExamples:\n+\t\n+\t// Leech implementation #1\n+\tfunction onLeechEffect1()\n+\t\t// Using wrapper from the package, event data is retrieved easily.\n+\t\tlet d = GetTriggerUnit().damageTarget(GetSpellTargetUnit(), LEECH_DAMAGE, ATTACK_TYPE_NORMAL, 0)\n+\n+\t\td.source.addHP(d.getActual()) // Heal is capped at target's hp\n+\t\td.source.addEffect(Abilities.vampiricAuraTarget, \"origin\").destr()\n+\n+\t\td.releaseInstance() // Don't forget to free the instance\n+\n+\tinit\n+\t\tregisterSpellEffectEvent(LEECH_ID, function onLeechEffect1)\n+\n+\t// Leech implementation #2\n+\tfunction onLeechEffect2()\n+\t\tGetTriggerUnit().damageTarget(GetSpellTargetUnit(), LEECH_DAMAGE, ATTACK_TYPE_NORMAL, LEECH_ID)\n+\n+\tinit\n+\t\tregisterSpellEffectEvent(LEECH_ID, function onLeechEffect2)\n+\t\taddDamageListener() d ->\n+\t\t\tif d.data == LEECH_ID\n+\t\t\t\td.source.addHP(d.getActual())\n+\t\t\t\td.source.addEffect(Abilities.vampiricAuraTarget, \"origin\").destr()\n+\n+\t// Simple damage resistance buff\n+\timport UniqueDamageListening\n+\n+\tfunction onBuffEffect()\n+\t\tlet target = GetSpellTargetUnit()\n+\t\tlet effect = target.addEffect(Abilities.voodooAuraTarget, \"origin\")\n+\t\tlet cb = addTargetDamageModifier() d ->\n+\t\t\td.amount -= d.initialAmount * .5\n+\t\tdoAfter(BUFF_DURATION) ->\n+\t\t\tremoveTargetDamageModifier(cb)\n+\t\t\teffect.destr()\n+\n+\tinit\n+\t\tregisterSpellEffectEvent(BUFF_ID, function onLeechEffect2)\n+*/\n+\n+// Configuration\n+\n+/** If Damage instance wasn't created by one of DamageModify package's functions\n+\t(or `new Damage(...)`), then Damage.data would be set to this value */\n+@configurable public constant DAMAGE_NONTRIGGERED_DATA = -1\n+\n+/** Describes default way to create Damage instance if damage event doesn't\n+\tcorrespond to any Damage instance. */\n+@configurable function getDamageFromEvent() returns Damage\n+\treturn new Damage(GetEventDamageSource(), GetTriggerUnit(), GetEventDamage(), false, false, getDamageType() == DamageType.SPELL ? ATTACK_TYPE_NORMAL : ATTACK_TYPE_CHAOS, null, null, DAMAGE_NONTRIGGERED_DATA)\n+\n+// Wrappers for unit.damageTarget with data attachment\n+\n+/** Deals triggered damage from unit to target. Additional data can be specified.\n+\tDamage instance with all arguments is saved and returned after being dealt,\n+\tso don't forget to call .releaseInstance() on it.\n+\n+\tIs a helper for `new Damage(*args*)..saveInstance()..modify()..deal()` */\n+public function unit.damageTarget(unit target, real amount, bool attack, bool ranged, attacktype attackType, damagetype damageType, weapontype weaponType, int data) returns Damage\n+\treturn new Damage(this, target, amount, attack, ranged, attackType, damageType, weaponType, data)..saveInstance()..modify()..deal()\n+\n+public function unit.damageTarget(unit target, real amount, attacktype attackType, int data) returns Damage\n+\treturn this.damageTarget(target, amount, false, false, attackType, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS, data)\n+\n+public function unit.damageTarget(unit target, real amount, int data) returns Damage\n+\treturn this.damageTarget(target, amount, false, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS, data)\n+\n+// Callbacks with direct Damage instance acquirement\n+\n+/** These callbacks are used to modify the damage.\n+\n+\tThey can be called zero or more times, so that their call is not guaranteed\n+\tfor every instance, still the usual case is one time per instance. */\n+public interface DamageModifier\n+\tfunction modify(Damage d)\n+\n+/** These callbacks are used to listen to the damage.\n+\n+\tThey are called strictly once per every damage instance, guaranteed,\n+\tbut they are disabled to modify. */\n+public interface DamageListener\n+\tfunction listen(Damage d)\n+\n+let damageModifiers = new LinkedList<DamageModifier>\n+\n+let damageListeners = new LinkedList<DamageListener>\n+\n+public function addDamageModifier(DamageModifier cb) returns DamageModifier\n+\tdamageModifiers.add(cb)\n+\treturn cb\n+\n+public function removeDamageModifier(DamageModifier cb)\n+\tdamageModifiers.remove(cb)\n+\n+public function addDamageListener(DamageListener cb) returns DamageListener\n+\tdamageListeners.add(cb)\n+\treturn cb\n+\n+public function removeDamageListener(DamageListener cb)\n+\tdamageListeners.remove(cb)\n+\n+// The wrapper class\n+\n+enum DamageState\n+\tCREATED // Initial state after creation\n+\tFIRING // Damage.deal() is called\n+\tACQUIRED // Damage is acquired by damage event handler\n+\tMODIFYING // Damage.modify() is called\n+\tLISTENING // Last processing stage; modifying is forbidden\n+\tFIRED // Damage instance is completely processed by system\n+\n+public function DamageState.toString() returns string\n+\tswitch this\n+\t\tcase CREATED\n+\t\t\treturn \"created\"\n+\t\tcase FIRING\n+\t\t\treturn \"firing\"\n+\t\tcase ACQUIRED\n+\t\t\treturn \"acquired\"\n+\t\tcase MODIFYING\n+\t\t\treturn \"modifying\"\n+\t\tcase LISTENING\n+\t\t\treturn \"listening\"\n+\t\tcase FIRED\n+\t\t\treturn \"fired\"\n+\n+\treturn \"error\"\n+\t\n+public class Damage\n+\n+\t// Event info\n+\n+\t/** Custom field which can be pinned damage event */\n+\tinteger data\n+\n+\tprivate unit source\n+\tprivate unit target\n+\tprivate bool ranged\n+\tprivate bool attack\n+\tprivate attacktype attackType\n+\tprivate damagetype damageType\n+\tprivate weapontype weaponType\n+\n+\t/** What amount of damage was originally convieved */\n+\tprivate real initialAmount\n+\t/** What amount of damage was convieved after modification*/\n+\tprivate real amount\n+\t/** Final amount of damage event */\n+\tprotected real actualAmount = 0\n+\t\n+\t/** Holds info about damage event state */\n+\tprotected DamageState state = DamageState.CREATED\n+\t/** It is set to true if the damage, when it was dealt, killed the target */\n+\tprotected bool killingBlow = false\n+\n+\tfunction getSource() returns unit\n+\t\treturn source\n+\tfunction getTarget() returns unit\n+\t\treturn target\n+\tfunction getRanged() returns bool\n+\t\treturn ranged\n+\tfunction getAttack() returns bool\n+\t\treturn attack\n+\tfunction getAttackType() returns attacktype\n+\t\treturn attackType\n+\tfunction getDamageType() returns damagetype\n+\t\treturn damageType\n+\tfunction getWeaponType() returns weapontype\n+\t\treturn weaponType\n+\tfunction getState() returns DamageState\n+\t\treturn state\n+\n+\t/** If the damage is modified by spell bracers ability. */\n+\tfunction isSpell() returns bool\n+\t\treturn attackType == ATTACK_TYPE_NORMAL\n+\n+\t/** Returns true if the damage is going to kill or already have killed target */\n+\tfunction isKillingBlow() returns bool\n+\t\treturn (state == DamageState.FIRED and killingBlow) or (state != DamageState.FIRED and target.getHP() - .406 < amount)\n+\n+\tfunction getInitial() returns real\n+\t\treturn initialAmount\n+\t/** Returns the actual damage that was withdrawn from the unit.\n+\t\tBecomes valid only for listeners and after the event. */\n+\tfunction getActual() returns real\n+\t\treturn actualAmount\n+\tfunction getAmount() returns real\n+\t\treturn amount\n+\n+\tprotected static Damage previousDamage = null","path":"wurst/event/DamageModify.wurst","position":218,"original_position":218,"commit_id":"77a082d325db924902edca95661550f60cc3cce5","original_commit_id":"77a082d325db924902edca95661550f60cc3cce5","user":{"login":"Halithor","id":3947140,"node_id":"MDQ6VXNlcjM5NDcxNDA=","avatar_url":"https://avatars3.githubusercontent.com/u/3947140?v=4","gravatar_id":"","url":"https://api.github.com/users/Halithor","html_url":"https://github.com/Halithor","followers_url":"https://api.github.com/users/Halithor/followers","following_url":"https://api.github.com/users/Halithor/following{/other_user}","gists_url":"https://api.github.com/users/Halithor/gists{/gist_id}","starred_url":"https://api.github.com/users/Halithor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Halithor/subscriptions","organizations_url":"https://api.github.com/users/Halithor/orgs","repos_url":"https://api.github.com/users/Halithor/repos","events_url":"https://api.github.com/users/Halithor/events{/privacy}","received_events_url":"https://api.github.com/users/Halithor/received_events","type":"User","site_admin":false},"body":"I prefer the global function for a static method. @Frotty Do you have an opinion on this?","created_at":"2018-09-10T14:26:49Z","updated_at":"2018-09-10T14:26:49Z","html_url":"https://github.com/wurstscript/WurstStdlib2/pull/60#discussion_r216342178","pull_request_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/pulls/60","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/wurstscript/WurstStdlib2/pulls/comments/216342178"},"html":{"href":"https://github.com/wurstscript/WurstStdlib2/pull/60#discussion_r216342178"},"pull_request":{"href":"https://api.github.com/repos/wurstscript/WurstStdlib2/pulls/60"}},"in_reply_to_id":216188018},"pull_request":{"url":"https://api.github.com/repos/wurstscript/WurstStdlib2/pulls/60","id":179920581,"node_id":"MDExOlB1bGxSZXF1ZXN0MTc5OTIwNTgx","html_url":"https://github.com/wurstscript/WurstStdlib2/pull/60","diff_url":"https://github.com/wurstscript/WurstStdlib2/pull/60.diff","patch_url":"https://github.com/wurstscript/WurstStdlib2/pull/60.patch","issue_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/issues/60","number":60,"state":"open","locked":false,"title":"new DamageModify package","user":{"login":"Trokkin","id":33575033,"node_id":"MDQ6VXNlcjMzNTc1MDMz","avatar_url":"https://avatars2.githubusercontent.com/u/33575033?v=4","gravatar_id":"","url":"https://api.github.com/users/Trokkin","html_url":"https://github.com/Trokkin","followers_url":"https://api.github.com/users/Trokkin/followers","following_url":"https://api.github.com/users/Trokkin/following{/other_user}","gists_url":"https://api.github.com/users/Trokkin/gists{/gist_id}","starred_url":"https://api.github.com/users/Trokkin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Trokkin/subscriptions","organizations_url":"https://api.github.com/users/Trokkin/orgs","repos_url":"https://api.github.com/users/Trokkin/repos","events_url":"https://api.github.com/users/Trokkin/events{/privacy}","received_events_url":"https://api.github.com/users/Trokkin/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-04-06T11:18:55Z","updated_at":"2018-09-10T14:26:49Z","closed_at":null,"merged_at":null,"merge_commit_sha":"064b3d33fe3ea7dc3e42f5a298568a715142759c","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/pulls/60/commits","review_comments_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/pulls/60/comments","review_comment_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/pulls/comments{/number}","comments_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/issues/60/comments","statuses_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/statuses/77a082d325db924902edca95661550f60cc3cce5","head":{"label":"Trokkin:damageModify","ref":"damageModify","sha":"77a082d325db924902edca95661550f60cc3cce5","user":{"login":"Trokkin","id":33575033,"node_id":"MDQ6VXNlcjMzNTc1MDMz","avatar_url":"https://avatars2.githubusercontent.com/u/33575033?v=4","gravatar_id":"","url":"https://api.github.com/users/Trokkin","html_url":"https://github.com/Trokkin","followers_url":"https://api.github.com/users/Trokkin/followers","following_url":"https://api.github.com/users/Trokkin/following{/other_user}","gists_url":"https://api.github.com/users/Trokkin/gists{/gist_id}","starred_url":"https://api.github.com/users/Trokkin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Trokkin/subscriptions","organizations_url":"https://api.github.com/users/Trokkin/orgs","repos_url":"https://api.github.com/users/Trokkin/repos","events_url":"https://api.github.com/users/Trokkin/events{/privacy}","received_events_url":"https://api.github.com/users/Trokkin/received_events","type":"User","site_admin":false},"repo":{"id":112095896,"node_id":"MDEwOlJlcG9zaXRvcnkxMTIwOTU4OTY=","name":"WurstStdlib2","full_name":"Trokkin/WurstStdlib2","owner":{"login":"Trokkin","id":33575033,"node_id":"MDQ6VXNlcjMzNTc1MDMz","avatar_url":"https://avatars2.githubusercontent.com/u/33575033?v=4","gravatar_id":"","url":"https://api.github.com/users/Trokkin","html_url":"https://github.com/Trokkin","followers_url":"https://api.github.com/users/Trokkin/followers","following_url":"https://api.github.com/users/Trokkin/following{/other_user}","gists_url":"https://api.github.com/users/Trokkin/gists{/gist_id}","starred_url":"https://api.github.com/users/Trokkin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Trokkin/subscriptions","organizations_url":"https://api.github.com/users/Trokkin/orgs","repos_url":"https://api.github.com/users/Trokkin/repos","events_url":"https://api.github.com/users/Trokkin/events{/privacy}","received_events_url":"https://api.github.com/users/Trokkin/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Trokkin/WurstStdlib2","description":"WurstScript Standard Library Version 2","fork":true,"url":"https://api.github.com/repos/Trokkin/WurstStdlib2","forks_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/forks","keys_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/teams","hooks_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/hooks","issue_events_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/issues/events{/number}","events_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/events","assignees_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/assignees{/user}","branches_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/branches{/branch}","tags_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/tags","blobs_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/git/refs{/sha}","trees_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/statuses/{sha}","languages_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/languages","stargazers_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/stargazers","contributors_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/contributors","subscribers_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/subscribers","subscription_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/subscription","commits_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/commits{/sha}","git_commits_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/git/commits{/sha}","comments_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/comments{/number}","issue_comment_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/issues/comments{/number}","contents_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/contents/{+path}","compare_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/merges","archive_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/downloads","issues_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/issues{/number}","pulls_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/pulls{/number}","milestones_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/milestones{/number}","notifications_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/labels{/name}","releases_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/releases{/id}","deployments_url":"https://api.github.com/repos/Trokkin/WurstStdlib2/deployments","created_at":"2017-11-26T15:55:41Z","updated_at":"2018-07-28T12:35:52Z","pushed_at":"2018-09-10T00:10:23Z","git_url":"git://github.com/Trokkin/WurstStdlib2.git","ssh_url":"git@github.com:Trokkin/WurstStdlib2.git","clone_url":"https://github.com/Trokkin/WurstStdlib2.git","svn_url":"https://github.com/Trokkin/WurstStdlib2","homepage":"","size":914,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"wurstscript:master","ref":"master","sha":"88ef4030c3b920d3cc3865d8f00be88f26315f07","user":{"login":"wurstscript","id":30814797,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMwODE0Nzk3","avatar_url":"https://avatars3.githubusercontent.com/u/30814797?v=4","gravatar_id":"","url":"https://api.github.com/users/wurstscript","html_url":"https://github.com/wurstscript","followers_url":"https://api.github.com/users/wurstscript/followers","following_url":"https://api.github.com/users/wurstscript/following{/other_user}","gists_url":"https://api.github.com/users/wurstscript/gists{/gist_id}","starred_url":"https://api.github.com/users/wurstscript/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wurstscript/subscriptions","organizations_url":"https://api.github.com/users/wurstscript/orgs","repos_url":"https://api.github.com/users/wurstscript/repos","events_url":"https://api.github.com/users/wurstscript/events{/privacy}","received_events_url":"https://api.github.com/users/wurstscript/received_events","type":"Organization","site_admin":false},"repo":{"id":55271025,"node_id":"MDEwOlJlcG9zaXRvcnk1NTI3MTAyNQ==","name":"WurstStdlib2","full_name":"wurstscript/WurstStdlib2","owner":{"login":"wurstscript","id":30814797,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMwODE0Nzk3","avatar_url":"https://avatars3.githubusercontent.com/u/30814797?v=4","gravatar_id":"","url":"https://api.github.com/users/wurstscript","html_url":"https://github.com/wurstscript","followers_url":"https://api.github.com/users/wurstscript/followers","following_url":"https://api.github.com/users/wurstscript/following{/other_user}","gists_url":"https://api.github.com/users/wurstscript/gists{/gist_id}","starred_url":"https://api.github.com/users/wurstscript/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wurstscript/subscriptions","organizations_url":"https://api.github.com/users/wurstscript/orgs","repos_url":"https://api.github.com/users/wurstscript/repos","events_url":"https://api.github.com/users/wurstscript/events{/privacy}","received_events_url":"https://api.github.com/users/wurstscript/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/wurstscript/WurstStdlib2","description":"WurstScript Standard Library Version 2","fork":false,"url":"https://api.github.com/repos/wurstscript/WurstStdlib2","forks_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/forks","keys_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/teams","hooks_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/hooks","issue_events_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/issues/events{/number}","events_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/events","assignees_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/assignees{/user}","branches_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/branches{/branch}","tags_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/tags","blobs_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/git/refs{/sha}","trees_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/statuses/{sha}","languages_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/languages","stargazers_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/stargazers","contributors_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/contributors","subscribers_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/subscribers","subscription_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/subscription","commits_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/commits{/sha}","git_commits_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/git/commits{/sha}","comments_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/comments{/number}","issue_comment_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/issues/comments{/number}","contents_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/contents/{+path}","compare_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/merges","archive_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/downloads","issues_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/issues{/number}","pulls_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/pulls{/number}","milestones_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/milestones{/number}","notifications_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/labels{/name}","releases_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/releases{/id}","deployments_url":"https://api.github.com/repos/wurstscript/WurstStdlib2/deployments","created_at":"2016-04-02T00:54:25Z","updated_at":"2018-09-10T09:21:08Z","pushed_at":"2018-09-10T14:05:08Z","git_url":"git://github.com/wurstscript/WurstStdlib2.git","ssh_url":"git@github.com:wurstscript/WurstStdlib2.git","clone_url":"https://github.com/wurstscript/WurstStdlib2.git","svn_url":"https://github.com/wurstscript/WurstStdlib2","homepage":"","size":868,"stargazers_count":26,"watchers_count":26,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":20,"mirror_url":null,"archived":false,"open_issues_count":4,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":20,"open_issues":4,"watchers":26,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/wurstscript/WurstStdlib2/pulls/60"},"html":{"href":"https://github.com/wurstscript/WurstStdlib2/pull/60"},"issue":{"href":"https://api.github.com/repos/wurstscript/WurstStdlib2/issues/60"},"comments":{"href":"https://api.github.com/repos/wurstscript/WurstStdlib2/issues/60/comments"},"review_comments":{"href":"https://api.github.com/repos/wurstscript/WurstStdlib2/pulls/60/comments"},"review_comment":{"href":"https://api.github.com/repos/wurstscript/WurstStdlib2/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/wurstscript/WurstStdlib2/pulls/60/commits"},"statuses":{"href":"https://api.github.com/repos/wurstscript/WurstStdlib2/statuses/77a082d325db924902edca95661550f60cc3cce5"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"Halithor"}}