Skip to content

Instantly share code, notes, and snippets.

@St3eT
Last active August 29, 2015 14:13
Show Gist options
  • Save St3eT/43796f0d9906f2786e29 to your computer and use it in GitHub Desktop.
Save St3eT/43796f0d9906f2786e29 to your computer and use it in GitHub Desktop.
Skills healer
diff --git a/L2J_Server/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java b/L2J_Server/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
index 697dab2..d907559 100644
--- a/L2J_Server/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
+++ b/L2J_Server/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
@@ -10713,7 +10713,8 @@
}
ConfirmDlg dlg = new ConfirmDlg(SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId());
dlg.addPcName(reviver);
- dlg.addString(Integer.toString(restoreExp));
+ dlg.addInt(restoreExp);
+ dlg.addInt(power);
sendPacket(dlg);
}
}
diff --git a/L2J_Server/java/com/l2jserver/gameserver/model/skills/targets/L2TargetType.java b/L2J_Server/java/com/l2jserver/gameserver/model/skills/targets/L2TargetType.java
index fb769e6..ae67ec0 100644
--- a/L2J_Server/java/com/l2jserver/gameserver/model/skills/targets/L2TargetType.java
+++ b/L2J_Server/java/com/l2jserver/gameserver/model/skills/targets/L2TargetType.java
@@ -46,6 +46,7 @@
HOLY,
NONE,
ONE,
+ ONE_FRIENDLY,
OWNER_PET,
PARTY,
PARTY_CLAN,
diff --git a/L2J_DataPack/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_DataPack/dist/game/data/scripts/handlers/MasterHandler.java
index 7e70f13..6d661cb 100644
--- a/L2J_DataPack/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_DataPack/dist/game/data/scripts/handlers/MasterHandler.java
@@ -208,6 +208,7 @@
import handlers.targethandlers.Ground;
import handlers.targethandlers.Holy;
import handlers.targethandlers.One;
+import handlers.targethandlers.OneFriendly;
import handlers.targethandlers.OwnerPet;
import handlers.targethandlers.Party;
import handlers.targethandlers.PartyClan;
@@ -547,6 +548,7 @@
Ground.class,
Holy.class,
One.class,
+ OneFriendly.class,
OwnerPet.class,
Party.class,
PartyClan.class,
diff --git a/L2J_DataPack/dist/game/data/scripts/handlers/targethandlers/OneFriendly.java b/L2J_DataPack/dist/game/data/scripts/handlers/targethandlers/OneFriendly.java
new file mode 100644
index 0000000..4adea04
--- /dev/null
+++ b/L2J_DataPack/dist/game/data/scripts/handlers/targethandlers/OneFriendly.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2004-2015 L2J DataPack
+ *
+ * This file is part of L2J DataPack.
+ *
+ * L2J DataPack is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J DataPack is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package handlers.targethandlers;
+
+import com.l2jserver.gameserver.handler.ITargetTypeHandler;
+import com.l2jserver.gameserver.model.L2Object;
+import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.actor.instance.L2SiegeFlagInstance;
+import com.l2jserver.gameserver.model.skills.Skill;
+import com.l2jserver.gameserver.model.skills.targets.L2TargetType;
+import com.l2jserver.gameserver.network.SystemMessageId;
+
+/**
+ * @author St3eT
+ */
+public final class OneFriendly implements ITargetTypeHandler
+{
+ @Override
+ public L2Object[] getTargetList(Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target)
+ {
+ // Check for null target or any other invalid target
+ if ((target == null) || target.isDead())
+ {
+ activeChar.sendPacket(SystemMessageId.THAT_IS_AN_INCORRECT_TARGET);
+ return EMPTY_TARGET_LIST;
+ }
+
+ if (!checkTarget(activeChar, target))
+ {
+ activeChar.sendPacket(SystemMessageId.THAT_IS_AN_INCORRECT_TARGET);
+ return EMPTY_TARGET_LIST;
+ }
+
+ // If a target is found, return it in a table else send a system message TARGET_IS_INCORRECT
+ return new L2Character[]
+ {
+ target
+ };
+ }
+
+ private boolean checkTarget(L2Character activeChar, L2Character target)
+ {
+ if ((target == null) || target.isAlikeDead() || target.isDoor() || (target instanceof L2SiegeFlagInstance) || target.isMonster())
+ {
+ return false;
+ }
+
+ if ((target.getActingPlayer() != null) && (target.getActingPlayer() != activeChar) && (target.getActingPlayer().inObserverMode() || target.getActingPlayer().isInOlympiadMode()))
+ {
+ return false;
+ }
+
+ if (target.isPlayable())
+ {
+ boolean friendly = false;
+
+ if ((activeChar.getAllyId() > 0) && (activeChar.getAllyId() == target.getActingPlayer().getAllyId()))
+ {
+ friendly = true;
+ }
+ else if ((activeChar.getClanId() > 0) && (activeChar.getClanId() == target.getActingPlayer().getClanId()))
+ {
+ friendly = true;
+ }
+ else if (activeChar.isInParty() && activeChar.getParty().containsPlayer(target.getActingPlayer()))
+ {
+ friendly = true;
+ }
+ else if ((target != activeChar) && (target.getActingPlayer().getPvpFlag() == 0))
+ {
+ friendly = true;
+ }
+ return friendly;
+ }
+ return true;
+ }
+
+ @Override
+ public Enum<L2TargetType> getTargetType()
+ {
+ return L2TargetType.ONE_FRIENDLY;
+ }
+}
\ No newline at end of file
diff --git a/L2J_DataPack/dist/game/data/scripts/handlers/targethandlers/PcBody.java b/L2J_DataPack/dist/game/data/scripts/handlers/targethandlers/PcBody.java
index 765a8eb..6dcaa06 100644
--- a/L2J_DataPack/dist/game/data/scripts/handlers/targethandlers/PcBody.java
+++ b/L2J_DataPack/dist/game/data/scripts/handlers/targethandlers/PcBody.java
@@ -95,7 +95,7 @@
if (!onlyFirst)
{
targetList.add(target);
- return targetList.toArray(new L2Object[targetList.size()]);
+ return targetList.toArray(new L2Character[targetList.size()]);
}
return new L2Character[]
{
diff --git a/L2J_DataPack/dist/game/data/stats/skills/11700-11799.xml b/L2J_DataPack/dist/game/data/stats/skills/11700-11799.xml
index 530d04c..c646659 100644
--- a/L2J_DataPack/dist/game/data/stats/skills/11700-11799.xml
+++ b/L2J_DataPack/dist/game/data/stats/skills/11700-11799.xml
@@ -87,45 +87,75 @@
<set name="isMagic" val="1" />
</skill>
<skill id="11755" levels="8" name="Radiant Heal">
- <!-- AUTO GENERATED SKILL -->
<!-- Heals target with 1488 Power added to M. Atk. If HP is full, CP is restored. -->
<table name="#mpConsumes"> 138 138 141 143 146 148 151 153 </table>
+ <table name="#power"> 1488 1495 1507 1519 1532 1544 1557 1570 </table>
+ <table name="#effectPoints"> 467 484 500 516 530 544 556 559 </table>
+ <table name="#magicLvl"> 85 86 88 90 92 94 96 98 </table>
<set name="icon" val="icon.skill11755" />
<set name="operateType" val="A1" />
- <set name="targetType" val="SELF" />
+ <set name="targetType" val="ONE" />
+ <set name="magicLvl" val="#magicLvl" />
<set name="mpConsume" val="#mpConsumes" />
<set name="castRange" val="600" />
+ <set name="effectPoint" val="#effectPoints" />
<set name="hitTime" val="4500" />
<set name="coolTime" val="500" />
<set name="reuseDelay" val="3000" />
+ <set name="rideState" val="NONE;STRIDER;WYVERN;WOLF" />
<set name="isMagic" val="1" />
+ <for>
+ <effect name="HpCpHeal">
+ <param power="#power" />
+ </effect>
+ </for>
</skill>
<skill id="11756" levels="8" name="Panic Heal">
- <!-- AUTO GENERATED SKILL -->
<!-- Heals target with 1488 Power added to M. Atk. If HP is full, CP is restored. -->
+ <table name="#power"> 1488 1495 1507 1519 1532 1544 1557 1570 </table>
<table name="#mpConsumes"> 207 208 212 216 218 222 226 230 </table>
+ <table name="#effectPoints"> 437 444 450 456 462 468 473 479 </table>
+ <table name="#magicLvl"> 85 86 88 90 92 94 96 98 </table>
<set name="icon" val="icon.skill11756" />
<set name="operateType" val="A1" />
- <set name="targetType" val="SELF" />
+ <set name="targetType" val="ONE" />
+ <set name="magicLvl" val="#magicLvl" />
<set name="mpConsume" val="#mpConsumes" />
<set name="castRange" val="600" />
+ <set name="effectPoint" val="#effectPoints" />
<set name="hitTime" val="1500" />
<set name="coolTime" val="500" />
<set name="reuseDelay" val="1000" />
<set name="isMagic" val="1" />
+ <for>
+ <effect name="HpCpHeal">
+ <param power="#power" />
+ </effect>
+ </for>
</skill>
<skill id="11757" levels="8" name="Brilliant Heal">
- <!-- AUTO GENERATED SKILL -->
<!-- Heals yourself and nearby party members with 1191 Power added to M. Atk. If HP is full, CP is restored. -->
+ <table name="#power"> 1191 1200 1210 1220 1230 1240 1250 1261 </table>
+ <table name="#effectPoints"> 431 467 500 530 556 566 576 586 </table>
<table name="#mpConsumes"> 277 281 286 290 295 300 305 310 </table>
+ <table name="#magicLvl"> 85 87 89 91 93 95 97 99 </table>
<set name="icon" val="icon.skill11757" />
<set name="operateType" val="A1" />
- <set name="targetType" val="SELF" />
+ <set name="targetType" val="PARTY" />
+ <set name="magicLvl" val="#magicLvl" />
<set name="mpConsume" val="#mpConsumes" />
+ <set name="affectRange" val="1000" />
+ <set name="effectPoint" val="#effectPoints" />
<set name="hitTime" val="6500" />
<set name="coolTime" val="500" />
<set name="reuseDelay" val="5000" />
+ <set name="rideState" val="NONE;STRIDER;WYVERN;WOLF" />
<set name="isMagic" val="1" />
+ <for>
+ <effect name="HpCpHeal">
+ <param power="#power" />
+ </effect>
+ </for>
</skill>
<skill id="11758" levels="1" name="Celestial Protection">
<!-- AUTO GENERATED SKILL -->
@@ -178,29 +208,49 @@
<set name="isMagic" val="1" />
</skill>
<skill id="11762" levels="1" name="Balance Heal">
- <!-- AUTO GENERATED SKILL -->
<!-- Equalizes all party members' HP and restores 333 HP every second for 15 seconds. -->
- <set name="icon" val="icon.skill11762" />
- <set name="operateType" val="A2" />
- <set name="targetType" val="SELF" />
- <set name="mpConsume" val="178" />
+ <set name="abnormalTime" val="15" />
+ <set name="affectRange" val="1000" />
+ <set name="effectPoint" val="398" />
<set name="hitTime" val="1500" />
<set name="coolTime" val="1000" />
+ <set name="icon" val="icon.skill11762" />
+ <set name="isMagic" val="1" /> <!-- Magic Skill -->
+ <set name="magicLvl" val="85" />
+ <set name="mpConsume" val="178" />
+ <set name="mpInitialConsume" val="36" />
+ <set name="operateType" val="A2" />
<set name="reuseDelay" val="20000" />
- <set name="isMagic" val="1" />
+ <set name="rideState" val="NONE;STRIDER;WYVERN;WOLF" />
+ <set name="targetType" val="PARTY" />
+ <for>
+ <effect name="RebalanceHP" />
+ <effect name="HealOverTime" ticks="1">
+ <param power="333" />
+ </effect>
+ </for>
</skill>
<skill id="11763" levels="1" name="Radiant Purge">
- <!-- AUTO GENERATED SKILL -->
<!-- Dispels target's debuffs. Allies only. -->
- <set name="icon" val="icon.skill11763" />
- <set name="operateType" val="A1" />
- <set name="targetType" val="SELF" />
- <set name="mpConsume" val="35" />
<set name="castRange" val="600" />
+ <set name="effectPoint" val="1" />
+ <set name="effectRange" val="1100" />
<set name="hitTime" val="1500" />
<set name="coolTime" val="500" />
+ <set name="icon" val="icon.skill11763" />
+ <set name="isMagic" val="1" /> <!-- Magic Skill -->
+ <set name="magicLvl" val="85" />
+ <set name="mpConsume" val="35" />
+ <set name="mpInitialConsume" val="12" />
+ <set name="operateType" val="A1" />
<set name="reuseDelay" val="3000" />
- <set name="isMagic" val="1" />
+ <set name="rideState" val="NONE;STRIDER;WYVERN;WOLF" />
+ <set name="targetType" val="ONE_FRIENDLY" />
+ <for>
+ <effect name="DispelByCategory">
+ <param slot="debuff" rate="100" max="10" />
+ </effect>
+ </for>
</skill>
<skill id="11764" levels="1" name="Brilliant Purge">
<!-- AUTO GENERATED SKILL -->
@@ -255,16 +305,32 @@
<set name="isMagic" val="1" />
</skill>
<skill id="11768" levels="1" name="Rebirth">
- <!-- AUTO GENERATED SKILL -->
<!-- Restores all party members' HP/MP/CP and has a chance of dispelling their debuffs. -->
<set name="icon" val="icon.skill11768" />
+ <set name="affectRange" val="1000" />
<set name="operateType" val="A1" />
- <set name="targetType" val="SELF" />
+ <set name="targetType" val="PARTY" />
<set name="mpConsume" val="66" />
+ <set name="magicLvl" val="85" />
<set name="hitTime" val="3000" />
<set name="coolTime" val="200" />
<set name="reuseDelay" val="600000" />
+ <set name="staticReuse" val="true" />
<set name="isMagic" val="1" />
+ <for>
+ <effect name="ManaHealPercent">
+ <param power="100" />
+ </effect>
+ <effect name="CpHealPercent">
+ <param power="100" />
+ </effect>
+ <effect name="HealPercent">
+ <param power="100" />
+ </effect>
+ <effect name="DispelByCategory">
+ <param slot="debuff" rate="15" max="10" />
+ </effect>
+ </for>
</skill>
<skill id="11769" levels="6" name="Dark Backfire">
<!-- AUTO GENERATED SKILL -->
@@ -442,18 +508,31 @@
<set name="isMagic" val="1" />
</skill>
<skill id="11784" levels="4" name="Blessed Resurrection">
- <!-- AUTO GENERATED SKILL -->
<!-- Resurrects a dead target and restores 85% of the XP lost. -->
- <table name="#mpConsumes"> 35 38 42 46 </table>
- <set name="icon" val="icon.skill11784" />
- <set name="operateType" val="A1" />
- <set name="targetType" val="SELF" />
- <set name="mpConsume" val="#mpConsumes" />
+ <table name="#mpConsume"> 35 38 42 46 </table>
+ <table name="#power"> 85 90 95 100 </table>
+ <table name="#magicLvl"> 85 90 95 99 </table>
+ <table name="#ench1mpConsume"> 147 142 137 132 127 122 117 112 108 103 </table>
+ <set name="blockedInOlympiad" val="true" />
<set name="castRange" val="400" />
<set name="hitTime" val="2000" />
<set name="coolTime" val="500" />
- <set name="reuseDelay" val="10000" />
+ <set name="icon" val="icon.skill11784" />
<set name="isMagic" val="4" />
+ <set name="magicLvl" val="#magicLvl" />
+ <set name="mpConsume" val="#mpConsume" />
+ <set name="operateType" val="A1" />
+ <set name="reuseDelay" val="10000" />
+ <set name="rideState" val="NONE;STRIDER;WYVERN;WOLF" />
+ <set name="targetType" val="PC_BODY" />
+ <cond>
+ <player canResurrect="true" />
+ </cond>
+ <for>
+ <effect name="Resurrection">
+ <param power="#power" />
+ </effect>
+ </for>
</skill>
<skill id="11785" levels="3" name="Party Resurrection">
<!-- AUTO GENERATED SKILL -->
diff --git a/L2J_DataPack/dist/game/data/stats/skills/11800-11899.xml b/L2J_DataPack/dist/game/data/stats/skills/11800-11899.xml
index 5188ac6..d22c571 100644
--- a/L2J_DataPack/dist/game/data/stats/skills/11800-11899.xml
+++ b/L2J_DataPack/dist/game/data/stats/skills/11800-11899.xml
@@ -282,16 +282,29 @@
<set name="isMagic" val="1" />
</skill>
<skill id="11826" levels="1" name="Emblem of Salvation">
- <!-- AUTO GENERATED SKILL -->
<!-- Resurrects from death fully recovered. Buffs/debuffs remain in death, but Noblesse Blessing and Lucky Charm disappear. -->
- <set name="icon" val="icon.skill11826" />
- <set name="operateType" val="A2" />
- <set name="targetType" val="SELF" />
- <set name="mpConsume" val="70" />
+ <set name="abnormalLvl" val="2" />
+ <set name="abnormalType" val="RESURRECTION_SPECIAL" />
+ <set name="abnormalTime" val="3600" />
<set name="castRange" val="600" />
+ <set name="effectPoint" val="1" />
+ <set name="effectRange" val="900" />
<set name="hitTime" val="4000" />
+ <set name="icon" val="icon.skill11826" />
+ <set name="isMagic" val="1" /> <!-- Magic Skill -->
+ <set name="magicLvl" val="85" />
+ <set name="mpConsume" val="70" />
+ <set name="mpInitialConsume" val="14" />
+ <set name="operateType" val="A2" />
<set name="reuseDelay" val="3600000" />
- <set name="isMagic" val="1" />
+ <set name="rideState" val="NONE;STRIDER;WYVERN;WOLF" />
+ <set name="staticReuse" val="true" />
+ <set name="targetType" val="ONE" />
+ <for>
+ <effect name="ResurrectionSpecial">
+ <param power="100" />
+ </effect>
+ </for>
</skill>
<skill id="11827" levels="5" name="Fairy Blessing">
<!-- AUTO GENERATED SKILL -->
@@ -301,16 +314,26 @@
<set name="reuseDelay" val="4000" />
</skill>
<skill id="11828" levels="1" name="Progressive Heal">
- <!-- AUTO GENERATED SKILL -->
<!-- Heals target and the 10 most injured allies around target by up to 40% of their Max HP. The recovery amount decreases starting from the most injured person. -->
- <set name="icon" val="icon.skill11828" />
- <set name="operateType" val="A1" />
- <set name="targetType" val="SELF" />
- <set name="mpConsume" val="573" />
+ <set name="affectLimit" val="5-12" />
+ <set name="affectRange" val="300" />
<set name="castRange" val="900" />
+ <set name="effectPoint" val="398" />
+ <set name="effectRange" val="1400" />
<set name="hitTime" val="3000" />
+ <set name="icon" val="icon.skill11828" />
+ <set name="isMagic" val="1" /> <!-- Magic Skill -->
+ <set name="magicLvl" val="85" />
+ <set name="mpConsume" val="573" />
+ <set name="operateType" val="A1" />
<set name="reuseDelay" val="5000" />
- <set name="isMagic" val="1" />
+ <set name="rideState" val="NONE;STRIDER;WYVERN;WOLF" />
+ <set name="targetType" val="AREA_FRIENDLY" />
+ <for>
+ <effect name="HealPercent">
+ <param power="40" />
+ </effect>
+ </for>
</skill>
<skill id="11830" levels="1" name="Blessing of Saha">
<!-- AUTO GENERATED SKILL -->
@@ -401,30 +424,57 @@
<set name="isDebuff" val="#isDebuffs" />
</skill>
<skill id="11850" levels="4" name="Miraculous Benediction">
- <!-- AUTO GENERATED SKILL -->
<!-- Restores clan members' CP/HP. Can only be used when MP is 50% or below. -->
<table name="#mpConsumes"> 185 205 225 243 </table>
+ <table name="#magicLvl"> 85 90 95 99 </table>
+ <table name="#mp"> 50 60 70 100 </table>
<set name="icon" val="icon.skill11850new" />
<set name="operateType" val="A1" />
- <set name="targetType" val="SELF" />
+ <set name="targetType" val="PARTY_CLAN" />
<set name="mpConsume" val="#mpConsumes" />
<set name="hitTime" val="10000" />
<set name="coolTime" val="500" />
<set name="reuseDelay" val="600000" />
<set name="isMagic" val="1" />
+ <set name="magicLvl" val="#magicLvl" />
+ <cond msgId="113" addName="1">
+ <player mp="#mp" />
+ </cond>
+ <for>
+ <effect name="CpHealPercent">
+ <param power="100" />
+ </effect>
+ <effect name="HealPercent">
+ <param power="100" />
+ </effect>
+ </for>
</skill>
<skill id="11851" levels="4" name="Divine Prayer">
- <!-- AUTO GENERATED SKILL -->
<!-- For 30 min., party members' HP heal amount + 5%. -->
- <table name="#mpConsumes"> 185 205 225 243 </table>
- <set name="icon" val="icon.skill11859" />
+ <table name="#abnormalLvls"> 4 5 6 7 </table>
+ <table name="#healEffect"> 1.05 1.07 1.1 1.15 </table>
+ <table name="#magicLvl"> 85 90 95 99 </table>
+ <table name="#mpInitialConsume"> 37 41 45 49 </table>
+ <table name="#mpConsume"> 185 205 225 243 </table>
+ <set name="abnormalLvl" val="#abnormalLvls" />
+ <set name="abnormalType" val="HEAL_EFFECT_UP" />
+ <set name="abnormalTime" val="1800" />
+ <set name="affectRange" val="1000" />
<set name="operateType" val="A2" />
- <set name="targetType" val="SELF" />
- <set name="mpConsume" val="#mpConsumes" />
+ <set name="icon" val="icon.skill11859" />
<set name="hitTime" val="1500" />
<set name="coolTime" val="500" />
<set name="reuseDelay" val="30000" />
<set name="isMagic" val="1" />
+ <set name="magicLvl" val="#magicLvl" />
+ <set name="mpConsume" val="#mpConsume" />
+ <set name="mpInitialConsume" val="#mpInitialConsume" />
+ <set name="targetType" val="PARTY" />
+ <for>
+ <effect name="Buff">
+ <mul stat="healEffect" val="#healEffect" />
+ </effect>
+ </for>
</skill>
<skill id="11852" levels="4" name="Mass Mana Gain">
<!-- AUTO GENERATED SKILL -->
diff --git a/L2J_DataPack/dist/game/data/xsd/skills.xsd b/L2J_DataPack/dist/game/data/xsd/skills.xsd
index 201a413..284598f 100644
--- a/L2J_DataPack/dist/game/data/xsd/skills.xsd
+++ b/L2J_DataPack/dist/game/data/xsd/skills.xsd
@@ -53,8 +53,8 @@
<xs:attribute type="xs:byte" name="invSize" use="optional" />
<xs:attribute type="xs:byte" name="weight" use="optional" />
<xs:attribute type="xs:string" name="hp" use="optional" />
- <xs:attribute type="xs:byte" name="cp" use="optional" />
- <xs:attribute type="xs:byte" name="mp" use="optional" />
+ <xs:attribute type="xs:string" name="cp" use="optional" />
+ <xs:attribute type="xs:string" name="mp" use="optional" />
<xs:attribute type="xs:byte" name="souls" use="optional" />
<xs:attribute type="xs:string" name="canTransform" use="optional" />
<xs:attribute type="xs:string" name="canUntransform" use="optional" />
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment