Advertisement
ICF-Soft

Readme ICFSoft_MainUtility

Aug 24th, 2016
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.13 KB | None | 0 0
  1. Contents:
  2. ======================================================================
  3.  
  4. 1 Introduction
  5. 2 Plugin notetags
  6. 2.1 Trait codes
  7. 2.2 Effect codes
  8. 2.3 Adding new codes
  9. 2.4 External traits and effects blocks
  10. 3 Self and battle switchs/variables system
  11. 4 Tags system
  12. 5 Plugin commands
  13. 6 Plugin script calls
  14. 6.1 Use of eval system
  15. 7 New array features
  16. 7.1 Without alter array
  17. 7.2 Altering array contents
  18. 7.3 Array from string
  19. 8 Terms of use
  20.  
  21.  
  22. 1 INTRODUCTION
  23. ======================================================================
  24.  
  25. This is a plugin with a lot of functionality making scripting easier.
  26.  
  27. There are some recurrent functions inside my plugins so it is made to
  28. englobe all I will need.
  29. It's required for the mayority of my plugins.
  30.  
  31. Attached to 1.05 version of plugin.
  32.  
  33.  
  34. 2 PLUGIN NOTETAGS
  35. ======================================================================
  36.  
  37. You can use json inside 'Json master' tag to add new fields or edit
  38. out of field limits. It's more usefull than meta-tags.
  39.  
  40. Use every line between open and close tags to edit a field, first
  41. field name followed by a two dots symbol, then one space and the code
  42. in json format.
  43.  
  44. Example:
  45.  
  46. <JSON MASTER>
  47. gold: 50000000
  48. hands_power: [50,100]
  49. grade: 'F'
  50. </JSON MASTER>
  51.  
  52.  
  53. You can add traits with 'Traits master'.
  54. Every line between open and close tags are three numbers separated by
  55. spaces. It is recomended to use the three numbers even if specified trait
  56. uses only two, next inline place can be used for comments.
  57. You can use a name instead of first number (see below for all names).
  58.  
  59. Example:
  60.  
  61. <TRAITS MASTER>
  62. elem_rate 1 1.5
  63. 21 1 2
  64. 31 2 0 -Attack element
  65. </TRAITS MASTER>
  66.  
  67.  
  68. You can add trait groups with 'Subtraits master'. These can be used
  69. as subclass traits, random enemy/item/equipment traits, alter states
  70. tiers and so on. It works like traits master but you don't need to
  71. close tag every time you open a new subtrait setup.
  72.  
  73. Example:
  74.  
  75. <SUBTRAITS MASTER> -Fire slime
  76. elem_rate 1 1.5
  77. 11 2 0.5
  78. 31 2 0 -Fire attack element
  79. <SUBTRAITS MASTER> -Cold slime
  80. elem_rate 1 1.5
  81. 11 2 2.1
  82. 31 3 0 -Cold attack element
  83. </SUBTRAITS MASTER>
  84.  
  85.  
  86. Note: More than one plugin can use subtraits in same data for different
  87. purposes so you must provide a way to use specific blocks, something
  88. like "<MyAmacingPluginSubtraits first last>" can be usefull.
  89.  
  90. To access a subtrait setup use 'item.subtraits[i].traits' instead of
  91. 'item.traits', where 'i' is the index.
  92. And for trait items use 'item.subtraits[i]' instead of 'item'.
  93.  
  94.  
  95. Effects master and Subeffects master tags work like traits/subtraits ones
  96. but are used for effects and effect setups, and need four numbers.
  97. You can use a name instead of first number (see below for all names).
  98.  
  99. Examples:
  100.  
  101. <EFFECTS MASTER>
  102. recover_hp 0 0.5 50
  103. gain_tp 0 10 0
  104. </EFFECTS MASTER>
  105.  
  106. <SUBEFFECTS MASTER>
  107. recover_mp 0 0.5 50
  108. gain_tp 0 5 0
  109. <SUBEFFECTS MASTER>
  110. recover_hp 0 0.5 50
  111. gain_tp 0 10 0
  112. </SUBEFFECTS MASTER>
  113.  
  114.  
  115. Note: More than one plugin can use subeffects in same data for different
  116. purposes so you must provide a way to use specific blocks, something
  117. like "<MyAmacingPluginSubeffects first last>" can be usefull.
  118.  
  119. To access a subeffect setup use 'item.subeffects[i].effects' instead of
  120. 'item.effects', where 'i' is the index.
  121. And for effect items use 'item.subeffects[i]' instead of 'item'.
  122.  
  123.  
  124. You can add javascript code with 'Jseval master'. These code can be run
  125. when a condition is given or diverse pourposes.
  126. You can give single key, double key or more, and you dont't need
  127. to close tag every time you open a new code.
  128.  
  129. Example:
  130.  
  131. <JSEVAL MASTER A>
  132. this.gainTp(15);
  133. <JSEVAL MASTER A B>
  134. if (this == subject) this.gainMp(-10);
  135. v.setValue(10, v.value(10) + 2);
  136. </JSEVAL MASTER>
  137.  
  138. Some variables are passed and can be used inside code:
  139. - subject: the subject of the action.
  140. - item: the object used in the action. Can be an item or a skill.
  141. - isSkill: check if is an skill.
  142.  
  143.  
  144. You can add special tags for different pourposes with this:
  145.  
  146. <TAGS tag1 tag2>
  147. - Tags separated by spaces.
  148.  
  149. <TAG tag-name>
  150. - One tag that can include spaces.
  151.  
  152. Tags are divided into two groups based on where are.
  153. - Base tags are those inherited from actors and enemies (actors,
  154. classes, enemies and ingame given tags).
  155. - Other tags are those that can be attached (states, armors
  156. weapons...).
  157. - Battle tags are those that can be given in battle, are avaiable
  158. in battle and reset every battle. These are merged inside
  159. second group.
  160.  
  161. 2.1 Trait Codes-------------------------------------------------------
  162.  
  163. Here is the list of all trait names that can be used inside
  164. traits/subtraits master tags.
  165. You can find all trait codes used by default in RPG Maker MV plus
  166. those used by my plugins:
  167.  
  168. elem_rate
  169. debuffrate, ndebuffrate, cdebuffrate
  170. state_rate
  171. state_resist
  172. skill_rate, itemdamage_rate, weapon_rate
  173. elem_absorb, elem_curse, elem_reflect
  174. paramplus, paramrate, paramflat, paramxrate, paramxflat
  175. xparamplus, xparamrate, xparamflat
  176. sparamplus, sparamrate, sparamflat
  177. nparamplus, nparamrate, nparamflat, nparamxrate, nparamxflat
  178. pparamplus, pparamrate, pparamflat
  179. cparamplus, cparamrate, cparamflat, cparamxrate, cparamxflat
  180. tpplus, tprate, tpflat, tpxrate, tpxflat
  181. attack_elem
  182. attack_state
  183. attack_speed
  184. attack_times
  185. attack_weapon
  186. elem_enhace, skill_enhace, weapon_enhace, itemdamage_enhace
  187. stypeadd
  188. stypeseal
  189. skilladd
  190. skillseal
  191. equipweapon
  192. equiparmor
  193. equiplock
  194. equipseal
  195. slot_type
  196. action_plus
  197. special_flag
  198. collapse_type
  199. party_ability
  200.  
  201. 2.2 Effect Codes------------------------------------------------------
  202.  
  203. Here is the list of all effect names that can be used inside
  204. effects/effects master tags with its normal use. Gaps must be filled
  205. with zeroes.
  206. You can find all effect codes used by default in RPG Maker MV plus
  207. those used by my plugins:
  208.  
  209. recover_hp 0 hprate fixed
  210. recover_mp 0 mprate fixed
  211. gain_tp 0 value 0
  212. recover_cparam cparam fixed rate
  213. add_state stateId chance 0 -StateId = 0 will use battler attack states
  214. remove_state stateId chance 0
  215. add_buff paramId turns 0
  216. add_debuff paramId turns 0
  217. remove_buff paramId 0 0
  218. remove_debuff paramId 0 0
  219. add_nbuff paramId turns 0
  220. add_ndebuff paramId turns 0
  221. remove_nbuff paramId 0
  222. remove_ndebuff paramId 0
  223. add_cbuff paramId turns 0
  224. add_cdebuff paramId turns 0
  225. remove_cbuff paramId 0
  226. remove_cdebuff paramId 0
  227. special code 0 0 -There is actually only code here 0 = escape
  228. grow paramId value 0
  229. xgrow paramId value 0
  230. sgrow paramId value 0
  231. learn_skill skillId 0 0
  232. common_event eventId 0 0
  233. ngrow nparamId value 0
  234. pgrow nparamId value 0
  235. cgrow nparamId value 0
  236.  
  237. 2.3 Adding New Codes--------------------------------------------------
  238.  
  239. It is posible to add more trait and effect names for your plugins with
  240. these sentences:
  241.  
  242. ICF.MainUtility.traittags.push([name, code, offset]);
  243. ICF.MainUtility.effecttags.push([name, code, offset]);
  244.  
  245. name: the name used.
  246.  
  247. code: the result code when that name is used.
  248.  
  249. offset: an extra offset used if you want to recicle a code instead
  250. of using a new one. If not used put 0.
  251.  
  252. 2.4 External traits and effects blocks--------------------------------
  253.  
  254. Sometimes the same trait block is used for a lot of database objects
  255. or just some trait or effect block is needed for an object that is not
  256. in database.
  257.  
  258. There are 2 plugin parameters created for these pourposes.
  259.  
  260. You can create all traits and effects blocks you'll need same way as
  261. inside trait master and effect master tags (without open and close tags).
  262. You can use even the codes you have created.
  263.  
  264. To access an specified block you use ICF.Param.subTraits[i] and
  265. ICF.Param.subEffects[i] with i as a numerical index.
  266.  
  267.  
  268. 3 SELF AND BATTLE SWITCHES/VARIABLES SYSTEM
  269. ======================================================================
  270.  
  271. There is a special selfswitches and selfvariables system alowing to
  272. use switches and variables for events, maps and actors.
  273.  
  274. Also there are virtual party and enemy switches and variables. Party
  275. ones are party members switches and variables combinations.
  276. Selfswitches and variables have been expanded for enemies and troops and
  277. battleswitches and variables for actors and party.
  278.  
  279. Enemy self ones works different. There are atached to enemyId instead of
  280. position, so enemies with same id share selfswitches and variables.
  281.  
  282. Selfvariables system allows to use every value type or numerical
  283. strict values.
  284.  
  285. Battle ones are reciclable and are reset every battle.
  286.  
  287.  
  288. 4 TAGS SYSTEM
  289. ======================================================================
  290.  
  291. There is a special tags and battletags system that allows to give
  292. tags to actors, enemies, classes, items and so on.
  293.  
  294. Tags can be used for multiple pourposes.
  295.  
  296. 5 PLUGIN COMMANDS
  297. ======================================================================
  298.  
  299. selfswitch x true/false
  300. mapswitch x true/false
  301. actorswitch actorid x true/false
  302. enemyswitch enemyid x true/false
  303. battleswitch x true/false
  304. actorbattleswitch actorid x true/false
  305. enemybattleswitch enemyposition x true/false
  306.  
  307. - Turns on/off specified selfswitch or mapswitch.
  308. You can also use an actorswitch.
  309.  
  310. remoteswitch mapid eventid x true/false
  311.  
  312. - Turns on/off specified selfswitch or mapswitch remotely.
  313. Use eventid 0 for a mapswitch.
  314.  
  315. selfvariable x value
  316. mapvariable x value
  317. actorvariable actorid x value
  318. enemyvariable enemyid x value
  319. battlevariable x value
  320. actorbattlevariable actorid x value
  321. enemybattlevariable enemyposition x value
  322.  
  323. - Changes value of specified selfvariable or mapvariable.
  324. You can also use an actorvariable.
  325. You can put increase/multiply/divide/mod prefix.
  326.  
  327. remotevariable mapid eventid x value
  328.  
  329. - Changes value of specified selfvariable or mapvariable remotely.
  330. Use eventid 0 for a mapvariable.
  331. You can put increase/multiply/divide/mod prefix.
  332.  
  333. actortraitadd actorid code id value
  334. partymembertraitadd actorpos code id value
  335. enemytraitadd enemy code id value
  336.  
  337. - Adds an ingame trait to specified actor, actor in party or
  338. in battle enemy.
  339. Doesn't check for repeated traits (same code and id).
  340.  
  341. actortrait actorid code id value
  342. partymembertrait actorpos code id value
  343. enemytrait enemy code id value
  344.  
  345. - Ensures an ingame trait to specified actor, actor in party or
  346. in battle enemy. If there isn't it'll be added, if there is at
  347. least one it'll be replaced and all repeated traits will be
  348. removed.
  349.  
  350. actortraitplus actorid code id value
  351. partymembertraitplus actorpos code id value
  352. enemytraitplus enemy code id value
  353.  
  354. - Increase existing ingame trait to specified actor, actor in
  355. party or in battle enemy by a value. If there isn't it'll be
  356. added, and every repeated trait will be merged togeder by sum.
  357.  
  358. actortraitrate actorid code id value
  359. partymembertraitrate actorpos code id value
  360. enemytraitrate enemy code id value
  361.  
  362. - Multiply existing ingame trait to specified actor, actor in
  363. party or in battle enemy by a value. If there isn't it'll be
  364. added, and every repeated trait will be merged togeder by
  365. multiplication.
  366.  
  367. removeactortrait actorid code id
  368. removepartymembertrait actorpos code id
  369. removeenemytraitenemy code id
  370.  
  371. - Remove all ingame traits with specified code and id to specified
  372. actor, actor in party or in battle enemy.
  373.  
  374. clearactortraits actorid
  375. clearpartymembertraits actorpos
  376. clearenemytraits enemy
  377.  
  378. - Remove all ingame traits to specified actor, actor in party or
  379. in battle enemy.
  380.  
  381. addactortag actorid tag
  382. addpartymembertag actorposition tag
  383. addenemytag enemypos tag
  384.  
  385. - Add ingame tags to specified actor, actor in party or in battle
  386. enemy. You can add all tags you want in a single line.
  387.  
  388. removeactortag actorid tag
  389. removepartymember actorposition tag
  390. removeenemy enemypos tag
  391.  
  392. - Remove ingame tags to specified actor, actor in party or in battle
  393. enemy. You can place all tags you want to remove in a single line.
  394.  
  395. clearactortag actorid tag
  396. clearpartymember actorposition tag
  397. clearenemy enemypos tag
  398.  
  399. - Remove all ingame tags to specified actor, actor in party or in
  400. battle enemy.
  401.  
  402. By changing addactortag to addactorbattletag you can give battletags.
  403. Can be applied to all these tag commands.
  404.  
  405. 6 PLUGIN SCRIPT CALLS
  406. ======================================================================
  407.  
  408. There are some script calls that can be used inside formulas and code
  409. or if you want to use instead of plugin commands:
  410.  
  411. Managing selfswitchs and variables for events, actors and enemies:
  412.  
  413. selfswitch(selfswitch);
  414. setselfswitch(selfswitch, value)
  415. selfvariable(selfvariable)
  416. strictselfvariable(selfvariable)
  417. setselfvariable(selfvariable, value)
  418. increaseselfvariable(selfvariable, value)
  419. multiplyselfvariable(selfvariable, value)
  420. divideselfvariable(selfvariable, value)
  421. modselfvariable(selfvariable, value)
  422.  
  423. battleswitch(selfswitch);
  424. setbattleswitch(selfswitch, value)
  425. battlevariable(selfvariable)
  426. strictbattlevariable(selfvariable)
  427. setbattlevariable(selfvariable, value)
  428. increasebattlevariable(selfvariable, value)
  429. multiplybattlevariable(selfvariable, value)
  430. dividebattlevariable(selfvariable, value)
  431. modbattlevariable(selfvariable, value)
  432.  
  433. Getting all selfswitch and variable keys or key names for maps, events,
  434. actors and enemies:
  435.  
  436. selfswitches()
  437. selfswitchNames()
  438. selfvariables()
  439. selfvariableNames()
  440.  
  441.  
  442. Managing mapswitchs and variables inside events and maps:
  443.  
  444. mapswitch(mapswitch)
  445. setmapswitch(mapswitch, value)
  446. mapvariable(mapvariable)
  447. strictmapvariable(mapvariable)
  448. setmapvariable(mapvariable, value)
  449. increasemapvariable(mapvariable, value)
  450. multiplymapvariable(mapvariable, value)
  451. dividemapvariable(selfvariable, value)
  452. modmapvariable(selfvariable, value)
  453. mapswitches()
  454. mapswitchNames()
  455. mapvariables()
  456. mapvariableNames()
  457.  
  458. Getting party switches and variables combinations:
  459.  
  460. selfswitch(selfswitch)
  461. - Check if at least one party member has this switch.
  462.  
  463. selfvariable(selfvariable)
  464. maxselfvariable(selfvariable)
  465. minselfvariable(selfvariable)
  466. avgselfvariable(selfvariable)
  467. - Check sum, max, min or average value of all party members
  468. variable.
  469.  
  470. -change self to battle for battle switches/variables.
  471.  
  472. To change switchs and variables remotely:
  473.  
  474. ICF.MainUtility.CustomSwitch(mapid, evid, switchname, value)
  475. ICF.MainUtility.CustomVariable(mapid, evid, variablename, value)
  476. ICF.MainUtility.IncreaseCustomVariable(mapid, evid, variablename, value)
  477. ICF.MainUtility.MultiplyCustomVariable(mapid, evid, variablename, value)
  478. ICF.MainUtility.DivideCustomVariable(mapid, evid, variablename, value)
  479. ICF.MainUtility.ModCustomVariable(mapid, evid, variablename, value)
  480. - You can use evid 0 for map ones.
  481. You can use mapid 0 for actor ones.
  482. You can use mapid "e" for enemy ones.
  483.  
  484.  
  485. To change battle switchs and variables remotely:
  486.  
  487. ICF.MainUtility.BattleSwitch(code, enemy, switchname, value)
  488. ICF.MainUtility.BattleVariable(code, enemy, variablename, value)
  489. ICF.MainUtility.IncreaseBattleVariable(code, enemy, variablename, value)
  490. ICF.MainUtility.MultiplyBattleVariable(code, enemy, variablename, value)
  491. ICF.MainUtility.DivideBattleVariable(code, enemy, variablename, value)
  492. ICF.MainUtility.ModBattleVariable(code, enemy, variablename, value)
  493. - Use code and enemy 0 for normal ones.
  494. Use code 0 for actor ones.
  495. Use code "e" for enemy ones.
  496.  
  497.  
  498. To validate html colors ingame without trowing error for invalid ones:
  499.  
  500. ICF.MainUtility.validateColor(color)
  501.  
  502. To add/remove ingame traits:
  503.  
  504. ICF.MainUtility.addTrait(data, mode, code, dataid, value)
  505. - Data must be an actor or enemy.
  506. Modes:
  507. 0: Add trait without check if there is one already.
  508. 1: Add trait and removes all repeated (same code and dataid).
  509. 2: Sums value to trait and joins all repeated by sum.
  510. 3: Multiplies value to trait and joins all repeated by
  511. multiplication.
  512. If there isn't a trait with specified code and dataid it will
  513. be added.
  514.  
  515. ICF.MainUtility.removeTrait(data, code, dataid)
  516. - Data must be an actor or enemy.
  517. Removes all ingame traits with specified code and dataid.
  518.  
  519. You can add/remove traits directy from actor/enemy with these:
  520.  
  521. actor/enemy addTrait(code, dataid, value)
  522. actor/enemy setTrait(code, dataid, value)
  523. actor/enemy increaseTrait(code, dataid, value)
  524. actor/enemy multiplyTrait(code, dataid, value)
  525. actor/enemy removeTrait(code, dataid)
  526.  
  527. actor/enemy clearTraits()
  528. - Removes all ingame traits from actor/enemy.
  529.  
  530.  
  531. You can add/remove tags/battletags directy from actor/enemy with these:
  532.  
  533. actor/enemy addTag(tag)
  534. actor/enemy addTags(tags)
  535. actor/enemy removeTag(tag)
  536. actor/enemy removeTags(tags)
  537. actor/enemy clearTags()
  538. actor/enemy addBattleTag(tag)
  539. actor/enemy addBattleTags(tags)
  540. actor/enemy removeBattleTag(tag)
  541. actor/enemy removeBattleTags(tags)
  542. actor/enemy clearBattleTags()
  543.  
  544. You can check if an actor/enemy has a tags or count how many tags has
  545. with these:
  546.  
  547. actor/enemy hasBaseTag(tag)
  548. actor/enemy hasStateTag(tag, fix)
  549. actor/enemy hasWeaponTag(tag)
  550. actor/enemy hasArmorTag(tag)
  551. actor/enemy hasEquipTag(tag)
  552. actor/enemy hasTag(tag, fix)
  553. actor/enemy countBaseTags(tags)
  554. actor/enemy countStateTags(tags, fix)
  555. actor/enemy countWeaponTags(tags)
  556. actor/enemy countArmorTags(tags)
  557. actor/enemy countEquipTags(tags)
  558. actor/enemy countTags(tags, fix)
  559.  
  560. And access tags with these other:
  561.  
  562. actor/enemy baseTags()
  563. actor/enemy battleTags()
  564. actor/enemy stateTags(fix)
  565. actor/enemy weaponTags()
  566. actor/enemy armorTags()
  567. actor/enemy equipTags()
  568. actor/enemy allTags(fix)
  569.  
  570. - tag: a string that represents a tag.
  571. - tags: an array of tags.
  572. - fix: if a state is applied based on having or not having a tag
  573. it must have 'true' as a value, else should be removed.
  574.  
  575.  
  576. 6.1 Use of eval system------------------------------------------------
  577.  
  578. To call javascript code attached to a battler use jsevalreactions
  579. funtions. Usefull for plugin programing.
  580.  
  581. jsevalReactions(subject, item, isSkill, reaction)
  582. - reaction is a string or a key.
  583. Example: 'a'
  584.  
  585. jsevalArrayReactions(subject, item, isSkill, reactions)
  586. - reactions is an array of strings and/or keys.
  587. Example: ['a','b',['a','c']]
  588.  
  589. jsevalBulkReactions(subject, item, isSkill, reactions)
  590. - reactions is an array of arrays that are used to form keys.
  591. Example: [['a',[1,2]],['b',[2,3]]]
  592. Will result ['a',1],['a',2],['b',2] and ['b',3] keys.
  593.  
  594. - subject is a battler, is usefull for origin of an action.
  595. - item is the object used in the action. Can be usually an
  596. item or a skill.
  597. - isSkill is used when is check if is an skill needed.
  598.  
  599.  
  600. 7 NEW ARRAY FEATURES
  601. ======================================================================
  602.  
  603. Array.range()
  604. - Creates a new array within a range. You can use up to three
  605. arguments:
  606. 1: from 1 to value (or -1 to value if negative).
  607. 2: from first to second value.
  608. 3: from first to second value with steps.
  609.  
  610. Array.coincidences()
  611. - Creates a new array with all non-repeated values that are
  612. present in all arrays.
  613. You can use only arrays for arguments but can use all you will
  614. need.
  615.  
  616. 7.1 Without alter array-----------------------------------------------
  617.  
  618. cleaned()
  619. - Returns an array without empty values.
  620.  
  621. cleanedAll()
  622. - Same as previous but cleans also arrays inside.
  623.  
  624. numbers()
  625. - Returns all numbers from array.
  626.  
  627.  
  628. 7.2 Altering array contents-------------------------------------------
  629.  
  630. removeRepeated()
  631. - Removes all repeated values.
  632.  
  633. clean()
  634. - Removes all empty values.
  635.  
  636. cleanAll()
  637. - Removes all empty values plus empty values of inside arrays.
  638.  
  639. extend()
  640. - Extend array with ranges. If there is a range conector ('to'
  641. in english, 'a' and 'hasta' in spanish) it will concatenate
  642. with a range of conector surrounding values.
  643.  
  644. fixedBlocks(mod)
  645. - Ensures that length can be divided by adding empty indexes.
  646.  
  647. leaveNumbers()
  648. - Removes all non numerical values.
  649.  
  650. reduceToFit()
  651. - Reduces lenght of array to fit other arrays length.
  652. You can use only arrays for arguments but can use all you will
  653. need.
  654.  
  655. 7.3 Array from string-------------------------------------------------
  656.  
  657. doubleSplit()
  658. - Two step split. First by commas and inside arrays by spaces.
  659.  
  660. doubleSplitNumbers()
  661. - Same as previous but check for ranges and leave numbers.
  662.  
  663.  
  664. 8 TERMS OF USE
  665. ======================================================================
  666.  
  667. * For commercial and non-commercial games.
  668.  
  669. * Credit to ICF-Soft.
  670.  
  671. * Any plugin that needs this to work must add a clausule to
  672. say that ICF-Soft must be included in credits page.
  673.  
  674. * Plugin entire header and readme files must be included
  675. with plugin.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement