XRWS           BA     Aħext_01.cat ext_01.dat md/BetterKillCredit.xml 13439 1648785121 5f0280ecb77660c71f3300529c0f47d0
md/Notifications.xml 3378 1648786032 b8d249ba999a9fe5756f70cfd236fc08
<?xml version="1.0" encoding="utf-8"?>
<mdscript name="BetterKillCredit" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../extracted/md/md.xsd">
  <cues>
    <cue name="AttackAccumulator">
      <actions>
        <create_group groupname="$Monitored"/>
      </actions>
      <cues>
        <cue name="FirstDamage" instantiate="true">
          <conditions>
            <event_player_owned_attacked_object/>
            <check_value value="event.param2.isclass.[class.ship_m, class.ship_l, class.ship_xl, class.module, class.station]"/>
            <check_value value="event.param2.hasrelation.enemy.{faction.player}"/>
            <check_value value="event.param2.relationchange.policefaction.bounty gt 0"/>
            <check_value value="event.param.isoperational and @event.param.dps.all" comment="beware cases where objects without dps can cause damage, such as from ramming or death explosion"/>
            <check_value value="$Monitored.indexof.{event.param2} == 0"/>
          </conditions>
          <actions>
            <do_if value="event.param2.isoperational">
              <add_to_group groupname="$Monitored" object="event.param2"/>
              <!-- note: there's no way to get raw damage values linked to a event_player_owned_attacked_object event, so we just assume DPS and cap events at 1/sec -->
              <signal_cue_instantly cue="MonitorTarget" param="[event.param2, event.param]"/>
            </do_if>
          </actions>
        </cue>
        <cue name="MonitorTarget" instantiate="true" namespace="this">
          <conditions>
            <event_cue_signalled/>
          </conditions>
          <actions>
            <set_value name="$Target" exact="event.param.{1}"/>
            <set_value name="$LastHitTime" exact="player.age"/>
            <set_value name="$Damage" exact="[event.param.{2}.dps.lasers.all, if (event.param.{2}.dps.lasers.all le 0) then event.param.{2}.dps.missiles.all else 0, event.param.{2}.dps.turrets.all / 3].max"/>
            <set_value name="$RequiredDamage" exact="if ($Target.maxshield le 0) then ($Target.maxhull / 2) else [$Target.maxhull, $Target.maxshield].min"/>
            <!-- require extra for large objects since we're also counting surface elements -->
            <do_if value="$Target.isclass.[class.ship_l, class.ship_xl, class.module, class.station]">
              <set_value name="$RequiredDamage" exact="($RequiredDamage * 1.5)i"/>
            </do_if>
            <create_group groupname="$PlayerAttackers"/>
            <add_to_group groupname="$PlayerAttackers" object="event.param.{2}"/>
          </actions>
          <cues>
            <cue name="MonitorTimeout" checkinterval="1min">
              <conditions>
                <check_value value="player.age - $LastHitTime ge 5min"/>
              </conditions>
              <actions>
                <remove_from_group group="AttackAccumulator.$Monitored" object="$Target"/>
                <cancel_cue cue="MonitorTarget"/>
              </actions>
            </cue>
            <cue name="MonitorDamage" instantiate="true">
              <conditions>
                <event_player_owned_attacked_object attacked="$Target"/>
                <check_value value="event.param.isoperational"/>
                <check_value value="player.age - $LastHitTime ge 1s"/>
              </conditions>
              <actions>
                <set_value name="this.$Attacker" exact="if event.param.isclass.defensible then event.param else event.param.defensible"/>
                <set_value name="$LastHitTime" exact="player.age"/>
                <set_value name="$Damage" exact="[this.$Attacker.dps.lasers.all, if (this.$Attacker.dps.lasers.all le 0) then this.$Attacker.dps.missiles.all else 0, this.$Attacker.dps.turrets.all / 3].max" operation="add"/>
                <add_to_group groupname="$PlayerAttackers" object="this.$Attacker"/>
              </actions>
            </cue>
            <cue name="MonitorKilled">
              <conditions>
                <check_any>
                  <event_object_destroyed object="$Target"/>
                  <event_object_abandoned object="$Target"/>
                  <event_object_changed_owner object="$Target"/>
                </check_any>
              </conditions>
              <actions>
                <do_if value="event.name == 'event_object_destroyed' and not @event.param.isplayerowned and $Damage ge $RequiredDamage and $PlayerAttackers.count gt 0">
                  <debug_text text="'Receive kill credit for final blow dealt by ' + @event.param.knownname"/>
                  <set_value name="$BaseObject" exact="$Target"/>
                  <set_value name="$object" exact="$Target"/>
                  <set_value name="$KillMethod" exact="event.param2"/>
                  <set_value name="$Killer" exact="$PlayerAttackers.random"/>
                  <include_actions ref="SendToAttackResponse"/>
                </do_if>
                <remove_from_group group="AttackAccumulator.$Monitored" object="$Target"/>
                <cancel_cue cue="MonitorTarget"/>
              </actions>
            </cue>
          </cues>
        </cue>
      </cues>
    </cue>
    <!-- use with include_actions
         required vars: $object, $BaseObject, $KillMethod, $Killer
         optional vars: $component
      -->
    <library name="SendToAttackResponse">
      <actions>
        <!-- <set_value name="md.Notifications.IllegalActivity.$updatingrelation" exact="true" /> -->
        <set_value name="$oldrelation" exact="$BaseObject.relationto.{faction.player}" />
        <change_relation_on_kill killer="$Killer" killed="$BaseObject" method="$KillMethod" result="$relchange" />
        <set_value name="$newrelation" exact="$BaseObject.relationto.{faction.player}" />
        <!-- <set_value name="md.Notifications.IllegalActivity.$updatingrelation" exact="false" /> -->

        <do_if value="@$object.type == shiptype.escapepod">
          <!--<do_if value="$object.macro == macro.ship_gen_xs_escapepod_01_a_macro">-->
          <set_value name="$podowner" exact="$object.owner"/>
          <!-- propagate relation change to faction of the pod's passengers for doing such a horrible thing. -->
          <add_faction_relation faction="$podowner" otherfaction="faction.player" value="$newrelation - $oldrelation" reason="relationchangereason.killedobject"/>
          <debug_text text="'player destroyed a harmless escape pod with passengers from %s! oldrelation: %s, newrelation: %s, relchange: %s'.[$podowner, $oldrelation, $newrelation, $relchange]" chance="0"/>
        </do_if>

        <do_if value="$object">
          <set_value name="$index" exact="md.Notifications.IllegalActivity.$lastvictims.indexof.{$object}" />
          <do_if value="$index == 1">
            <set_value name="$data" exact="md.Notifications.IllegalActivity.$lastvictimdata.{1}" />
          </do_if>
          <do_else>
            <!-- Create victim data at front of list, or move entry to front -->
            <do_if value="not $index">
              <set_value name="$data" exact="[
                          $object, null, null, null,
                          -md.Notifications.IllegalActivity.$timeout, -md.Notifications.IllegalActivity.$timeout,
                          false, false, null, 0,
                          null, null, null, player.age, null, $Killer
                          ]" />
            </do_if>
            <do_else>
              <set_value name="$data" exact="md.Notifications.IllegalActivity.$lastvictimdata.{$index}" />
              <remove_value name="md.Notifications.IllegalActivity.$lastvictims.{$index}" />
              <remove_value name="md.Notifications.IllegalActivity.$lastvictimdata.{$index}" />
            </do_else>
            <set_value name="md.Notifications.IllegalActivity.$lastvictims.{1}" operation="insert" exact="$BaseObject" />
            <set_value name="md.Notifications.IllegalActivity.$lastvictimdata.{1}" operation="insert" exact="$data" />
          </do_else>
          <resize_list list="$data" count="[$data.count, 16].max"/>
          <set_value name="$data.{2}" exact="if ($Killer.exists and $Killer == player.occupiedship) then 'event_player_killed_object' else 'event_player_owned_killed_object'" />
          <set_value name="$data.{3}" exact="$KillMethod" />
          <set_value name="$data.{4}" exact="@$component" />
          <set_value name="$data.{11}" exact="$oldrelation" />
          <set_value name="$data.{12}" exact="$newrelation" />
          <set_value name="$data.{13}" exact="$relchange" />
          <set_value name="$data.{15}" exact="relationchangereason.killedobject" />
          <set_value name="$data.{16}" exact="$Killer"/>
          <signal_cue_instantly cue="md.Notifications.AttackResponse" param="$data" />
        </do_if>
      </actions>
    </library>
    <cue name="PlayerOwnedKills" instantiate="true" namespace="this">
      <conditions>
        <event_player_owned_killed_object/>
        <check_value value="event.param != player.occupiedship"/>
        <check_value value="event.param2.isclass.destructible" />
        <check_value value="event.param2.owner and event.param2.owner != faction.player and event.param2.owner != faction.ownerless" />
      </conditions>
      <actions>
        <do_if value="event.param2.isclass.defensible">
          <set_value name="$object" exact="event.param2" />
        </do_if>
        <do_else>
          <set_value name="$object" exact="event.param2.defensible" />
          <set_value name="$component" exact="event.param2" />
        </do_else>
        <!-- <debug_text text="'Destructible destroyed: object=%1, component=%2, owner=%3, pilot=%4, parent=%5'.[$object, @$component, event.param2.owner, @event.param2.pilot, event.param2.parent.knownname]" /> -->

        <set_value name="$BaseObject" exact="event.param2"/>
        <set_value name="$KillMethod" exact="event.param3"/>
        <set_value name="$Killer" exact="event.param"/>
        <include_actions ref="SendToAttackResponse"/>
      </actions>
    </cue>
    <!-- mostly a copy/paste of IllegalActivityRewardConvFinished unfortunately, since we can't pass the event.param2 that it wants -->
    <!-- legacy since v5.1 -->
    <library name="ApplyRewards" instantiate="true" namespace="this">
      <conditions>
        <event_cue_signalled/>
      </conditions>
      <actions>
        <set_value name="$rewardnpc" exact="event.param.{1}"/>
        <set_value name="$logdata" exact="table[ $tradeagent = null, $bounty = 0 ]"/>
        <set_value name="$reason" exact="event.param.{6}" />

        <do_if value="event.param == 'RewardChoice_TradeAgent' and not $rewardnpc.container.hastradesubscription">
          <add_trade_subscription object="$rewardnpc.container"/>
          <set_value name="player.entity.$tradesubscriptionsrewarded" exact="@player.entity.$tradesubscriptionsrewarded + 1"/>
          <set_value name="event.param.{5}" exact="null"/>

          <set_value name="$logdata.$tradeagent" exact="$rewardnpc.container"/>
          <set_value name="$printlog"/>
        </do_if>
        <do_if value="event.param.{5}" comment="bounty">
          <transfer_money from="$rewardnpc.container" to="faction.player" amount="event.param.{5}" />

          <set_value name="$logdata.$bounty" exact="event.param.{5}"/>
          <set_value name="$printlog"/>
        </do_if>
        <do_if value="event.param.{4}" comment="relbonus">
          <!-- If relation is negative, make the bonus proportional to the current relation, so we always get the same UI change -->
          <!-- (lower relation = higher reward, basically cancelling out the logarithmic UI scale) -->
          <set_value name="$oldrelation" exact="$rewardnpc.owner.relationto.{faction.player}" />
          <do_if value="$oldrelation lt -0.0032" comment="UI below -5">
            <!-- Divide negative relation by 10 (which is UI +10 in range -30 to -5) for each +0.0064 bonus (which is UI +10 in neutral range -5 to +5) -->
            <set_faction_relation faction="$rewardnpc.owner" otherfaction="faction.player" value="$oldrelation * 0.1 ^ (event.param.{4} / 0.006401)" reason="$reason" />
          </do_if>
          <do_else>
            <add_faction_relation faction="$rewardnpc.owner" otherfaction="faction.player" value="event.param.{4}" reason="$reason" />
          </do_else>
        </do_if>

        <do_if value="$printlog?">
          <set_value name="$logtitle" exact="{1016, 100}" comment="Rewarded for station defence"/>
          <set_value name="$logtext" exact="''"/>

          <do_if value="$logdata.$tradeagent">
            <set_value name="$logtext" exact="{1016, 101}.[$logtext, $rewardnpc.container.knownname, $rewardnpc.container.idcode, $rewardnpc.sector.knownname]" comment="Trade subscription at %s(Station name) /(%s(Station ID code)/) in sector %s(Sector name) awarded."/>
          </do_if>

          <write_to_logbook category="general" title="$logtitle" text="$logtext" money="$logdata.$bounty" faction="$rewardnpc.owner" object="$rewardnpc.container" interaction="showonmap"/>
        </do_if>
      </actions>
    </library>
  </cues>
</mdscript><?xml version="1.0" encoding="utf-8"?>
<diff xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <add sel="//cue[@name='AccumulateRewards']/actions//signal_cue[@cue='ReputationTriggerStart']" pos="before">
    <resize_list list="$curdata" count="[$curdata.count, 10].max"/>
    <set_value name="$curdata.{10}" exact="player.sector != $object.sector or ($object.zone != player.zone and player.entity.distanceto.{$object} gt 80km)"/>
    <do_if value="$curdata.{10}">
      <set_value name="$curdata.{7}" exact="null"/>
    </do_if>
  </add>
  <add sel="//cue[@name='ReputationTrigger']/actions//do_if[@value='$curdata.{1}.exists']" pos="after">
    <do_elseif value="@$curdata.{10}">
      <do_if value="@md.Notifications.IllegalActivityReward.exists">
        <signal_cue_instantly cue="IllegalActivityReward" param="$curdata"/>
      </do_if>
      <do_else>
        <signal_cue_instantly cue="RewardApplyInstant" param="$curdata"/>
      </do_else>
      <signal_cue_instantly cue="Cleanup_ReputationTrigger" param="this"/>
    </do_elseif>
  </add>
  <replace sel="//cue[@name='ReputationTrigger']/actions//do_if[@value='$curdata.{1}.exists']/@value">$curdata.{1}.exists and not @$curdata.{10}</replace>
  <!-- legacy since v5.1 -->
  <add sel="//cue[@name='IllegalActivity']/cues">
    <cue name="RewardApplyInstant" ref="md.BetterKillCredit.ApplyRewards">
    </cue>
  </add>
  <replace sel="//cue[@name='AttackResponse']/actions/do_if[contains(@value, 'event.param.{2} == ') and contains(@value, 'event_player_killed_object') and contains(@value, 'and not event.param.{4}')]/@value">(event.param.{2} == 'event_player_killed_object' or event.param.{2} == 'event_player_owned_killed_object') and not event.param.{4}</replace>
  <replace sel="//cue[@name='AttackResponse']/actions//do_else/do_if[contains(@value, 'event.param.{2} == ') and contains(@value, 'event_player_killed_object') and contains(@value, 'and not event.param.{4}')]/@value">(event.param.{2} == 'event_player_killed_object' or event.param.{2} == 'event_player_owned_killed_object') and not event.param.{4}</replace>
  <!-- TODO: as of 3.0 event.param.{16} handles this in vanilla code so after 3.0 is official all below can be deleted -->
  <add sel="//cue[@name='AttackResponse']/actions" pos="prepend">
    <set_value name="$player_object" exact="if @event.param.{16}.exists then event.param.{16} else player.controlled"/>
  </add>
  <replace sel="//cue[@name='AttackResponse']/actions/do_if/do_if/find_station/@space">$player_object.sector</replace>
  <replace sel="//cue[@name='AttackResponse']/actions/do_if/do_if/find_station/match_distance/@object">$player_object</replace>
  <replace sel="//cue[@name='AttackResponse']/actions/do_if/do_if/do_all/do_if/set_value[@name='$distance']/@exact">$stations.{$i}.distanceto.{$player_object}</replace>
  <replace sel="//cue[@name='AttackResponse']/actions//do_else/do_if/find_station/match_distance/@object">$player_object</replace>
  <replace sel="//cue[@name='AttackResponse']/actions//do_else/do_if/do_all/do_if/set_value[@name='$distance']/@exact">$stations.{$i}.distanceto.{$player_object}</replace>
  <!-- TODO: this one will need to stay in 3.0 but become $refobject.sector -->
  <replace sel="//cue[@name='AttackResponse']/actions//do_else/do_if/find_station/@space">$player_object.sector</replace>
</diff><?xml version="1.0" encoding="utf-8"?>
<content id="" author="Mysterial (mysterial@mysterial.net)" name="" description="" version="132" date="2022-04-01" save="false" lastupdate="">
</content>
