<p>Bonjour tout le monde !</p>
<p> </p>
<p>Aujourd'hui vous allez apprendre à ajouter un objet dans la boutique (dans notre exemple ça sera une arme, mais ça peut être avec tout type d'objet, il suffit juste d'adapter)</p>
<p>Avant toutes choses, il vous faut les pré-requis ! </p>
<p> </p>
<p><span style="color:#ff8c00;"><u><span style="font-size:36px;">Pré-requis :</span></u></span></p>
<p> </p>
<p>- Un serveur installé et fonctionnel, ainsi qu'un client (cf. : <iframe data-embed-src="<base_url>/topic/1234-cr%C3%A9er-un-serveur-priv%C3%A9/?do=embed" data-embedcontent="" frameborder="0" src="//melinyel.net/applications/core/interface/js/spacer.png"></iframe>)</p>
<p>- Avoir pris connaissance de ce tutoriel (Pour extraire les ressources essentiellement => <iframe data-embed-src="<base_url>/topic/1239-structure-de-s4-weaponx4/?do=embed" data-embedcontent="" frameborder="0" src="//melinyel.net/applications/core/interface/js/spacer.png"></iframe>)</p>
<p>- Navicat, pour éditer la base de donnée.</p>
<p>- Notepad++ (ça sera plus simple qu'un simple bloc note)</p>
<p>- Un petit peu de patience ! </p>
<p> </p>
<p><span style="color:#ff8c00;"><u><span style="font-size:36px;"><span style="font-family:'trebuchet ms', helvetica, sans-serif;">Etape 1 - Réglage des propriétés de l'arme :</span></span></u></span></p>
<p> </p>
<p>Alors, dans un premier temps, vous allez avec notepad++ ouvrir le fichier s4_weapons.x4 (Dans notre exemple, nous utiliserons le "Minegun")</p>
<p> </p>
<p>Utilisez la commande rapide une fois le fichier ouvert Ctrl + H afin d'ouvrir la barre de recherche, puis cherchez "Mine gun" :</p>
<p> </p>
<p><img alt="1415113512-ea488719162.png" src="<base_url>/applications/sslimageproxy/interface/image.php?url=http://image.noelshack.com/fichiers/2014/45/1415113512-ea488719162.png"/></p>
<p> </p>
<p>Vous devriez maintenant voir un contenu similaire à celui-ci : </p>
<pre class="ipsCode prettyprint">
<sub_category id="5">
<item number="1">
<product id="1" term_contract="NO_TIME_LIMIT" gm_price="40000" cash_price="0" durability_inital_value="2400" remaining_second="-1" refund_enable="true" />
<product id="2" term_contract="TS_5_HOURS" gm_price="5000" cash_price="0" durability_inital_value="-1" remaining_second="18000" refund_enable="true" />
<base name="그레네이드 건" require_level="0" exp_boost_percent="0" require_license="license_mine_gun" sale_mode="0" />
<client icon_image="Resources/Image/Weapon/icon_gun_mine.tga" attrib_comment="{A-L}{F-2002_12}볼 형태로 압축된 폭발성 에너지를{N}원하는 타이밍에 투척할 수 있도록{N}제작한 무기. 신체와 물체에 닿을 시{N}폭발하도록 설계되어 있다.{N}포물선으로 날아가는 에너지 볼의 {N}궤적을 연구할 필요가 있다.{N}{CB-0,255,0,255}[조작법]{N}마우스 왼쪽 버튼 : 에너지볼 발사{N}{CB-255,0,0,255}시범무기로써 라이센스로 획득한 무기만{N}사용할 수 있습니다.{N}추후 밸런스 조정 가능성이 있습니다." feature_comment="투척 무기" />
<license script_file="license_MineGun.lua" script_func="OnMineGunLicenseTest" license_map="104" />
<attach />
<weapon type="10" rate_of_fire="" power="45.0" move_speed_rate="1.0" attack_move_speed_rate="1.0" magazine_capacity="1" cracked_magazine_capacity="1" max_ammo="4" accuracy="" range="500.0" support_sniper_mode="0" sniper_mode_fov="15" reload_sound_file="Resources/Sound/grenade_reload.ogg" slot_image_file="Resources/Image/Weapon/slot_gun_mine.tga" crosshair_file="Resources/Image/Weapon/crosshair_gun_mine" crosshair_zoomin_file="Resources/Image/Weapon/crosshair_gun_mine" auto_target_distance="0.0">
<scene value="resources/Model/Weapon/minegun.scn" />
</weapon>
<lang>
<nation id="2" name_code="Mine Gun" attrib_comment_code="{A-L}{F-2002_12}Waffe, die zur gewünschten Zeit mit{N}konzentrierter Energie in Ballform angreift.{N}Eingerichtet, um bei physischem Kontakt zu{N}explodieren. Die Flugformation des Energieballs ist {N}noch unerforscht.{N}{CB-0,255,0,255}[Anwendung]{N}Linke Maustaste: Energieball abschießen{N}{CB-255,0,0,255}Dies ist eine befristete Waffe, die nur{N}durch den License Test erworben werden kann.{N}Spätere Änderungen zur Anpassung möglich." feature_comment_code="Throwing Weapon" />
<nation id="3" name_code="Mine Gun" attrib_comment_code="{A-L}{F-2002_12}Weapon with compressed explosive energy{N}in ball form for carefully timed sniping. It is made to{N}explode on physical contact. Research into the{N}flight of the ball is essential.{N}{CB-0,255,0,255}[Operation]{N}Click left mouse button: Fire weapon.{N}{CB-255,0,0,255}This is a temporary weapon{N}which can only be used by acquiring a weapons license.{N}Balance adjustment might be required afterwards." feature_comment_code="Throwing Weapon" />
<nation id="4" name_code="Mine Gun" attrib_comment_code="{A-L}{F-2002_12}Arme avec de l'énergie explosive compressée{N}sous la forme d'une balle pour tirer selon un timing précis. Elles sont faites{N}pour exploser au contact physique. Des recherches{N}sur le comportement de l'energyball sont nécessaires.{N}{CB-0,255,0,255}[Utilisation]{N}Clic gauche: tirer {N}{CB-255,0,0,255}C'est une arme temporaire{N}qui peut uniquement être utilisée pendant la licence{N}Des ajustements pourraient être nécessaires." feature_comment_code="Throwing Weapon" />
<nation id="5" name_code="Mine Gun" attrib_comment_code="{A-L}{F-2002_12}Weapon with compressed explosive energy{N}in ball form for sniping on desired timing. It is made{N}to explode on physical contact. Research of the{N}energyball flight formation is needed.{N}{CB-0,255,0,255}[Controls]{N}Left mouse button : Fire energyball {N}{CB-255,0,0,255}This is a temporary weapon{N}which can only be used by license acquired weapons{N}Balance adjustment might be required afterwards." feature_comment_code="Throwing Weapon" />
<nation id="6" name_code="Mine Gun" attrib_comment_code="{A-L}{F-2002_12}Arma ad energia compressa in una sfera{N}che esplode in un momento preciso.{N}Esplode a contatto. Fai attenzione{N}alla sua traettoria.{N}{CB-0,255,0,255}[Comandi]{N}Tasto sinistro: spara la energyball{N}{CB-255,0,0,255}Arma temporanea{N}da usare con armi di cui si ha la licenza.{N}Può essere necessario ribilanciarle." feature_comment_code="Throwing Weapon" />
<nation id="7" name_code="Mine Gun" attrib_comment_code="{A-L}{F-2002_12}Оружие со спресованной в шар{N}взрывной энергией для точных выстрелов с учетом{N}поправки на траекторию. Взрывается при физическом{N}контакте с противником.{N}{CB-0,255,0,255}[Управление]{N}Левая кнопка мыши: выстрелить шаром{N}{CB-255,0,0,255}Это временное оружие,{N}получить которое можно только через{N}Лицензию. Проводится балансировка." feature_comment_code="Throwing Weapon" />
</lang>
</item>
</pre>
<p><span style="color:#ff0000;"><span style="font-size:18px;">/!\ Afin que mon explication ne soit pas "flou" pour certains, je vous conseille d'aller voir dans un premier temps, ce sujet, avant d'aller plus loin : <iframe data-embed-src="<base_url>/topic/1239-structure-de-s4-weaponx4/?do=embed" data-embedcontent="" frameborder="0" src="//melinyel.net/applications/core/interface/js/spacer.png"></iframe></span></span></p>
<p> </p>
<p>Donc ! Voilà les lignes qui nous intéressent pour ce tutoriel, gardez les bien en vu ! Je vais vous expliquer pourquoi nous allons en avoir besoin juste après, dans l'étape 2 :</p>
<pre class="ipsCode prettyprint">
<sub_category id="5">
<item number="1">
<product id="1" term_contract="NO_TIME_LIMIT" gm_price="40000" cash_price="0" durability_inital_value="2400" remaining_second="-1" refund_enable="true" />
<product id="2" term_contract="TS_5_HOURS" gm_price="5000" cash_price="0" durability_inital_value="-1" remaining_second="18000" refund_enable="true" /></pre>
<p>Petite explication brève des variables (non-vu dans le sujet sur la structure de weapons) :</p>
<p> </p>
<p>- <u>term_contract :</u> Ceci correspond à la durée d'utilisation de l'objet avant qu'il ne disparaisse de l'inventaire.</p>
<p><span style="color:#ff0000;"><u><strong>ATTENTION ! BUG REPÉRÉ !</strong></u></span></p>
<p> </p>
<p>Quel est le soucis rencontré avec l'émulateur à ce sujet actuellement ? (Petite astuce pour y faire face.)</p>
<p>Certains qui auront déjà tentés l'auront remarqués, les objets malgré qu'on leur mettent un term_contract "NO_TIME_LIMIT" et un remaining_second de "-1" disparaissent après un certain temps (variable et vous allez comprendre pourquoi, même si c'est ridicule.)</p>
<p>Si vous utilisez un product_id différent de 1 pour un objet illimité, celui-ci ne le sera tout simplement jamais (en terme d'expiration de temps)</p>
<p>Pourquoi ? C'est une question que je me pose, cela doit venir certainement de l'émulateur, mais pas que, le client datant un peu doit y être pour quelque chose.</p>
<p>EN TOUT CAS ! si vous voulez des exemples de product_id valides, avec les bons temps d'expiration, prenez cet exemple là, qui lui est bon (je précise aussi qu'il n'y a que le "temps" qui est touché par le bug, et rien d'autre) : </p>
<pre class="ipsCode prettyprint">
<product id="1" term_contract="NO_TIME_LIMIT" gm_price="29000" cash_price="0" durability_inital_value="2400" remaining_second="-1" refund_enable="true" />
<product id="2" term_contract="TS_5_HOURS" gm_price="5000" cash_price="0" durability_inital_value="-1" remaining_second="18000" refund_enable="true" />
<product id="3" term_contract="NO_TIME_LIMIT" gm_price="0" cash_price="0" durability_inital_value="2400" remaining_second="-1" refund_enable="false" />
<product id="4" term_contract="TS_1_HOURS" gm_price="1000" cash_price="0" durability_inital_value="-1" remaining_second="3600" refund_enable="true" />
<product id="5" term_contract="TS_3_HOURS" gm_price="3000" cash_price="0" durability_inital_value="-1" remaining_second="10800" refund_enable="true" />
<product id="6" term_contract="TS_7_HOURS" gm_price="7000" cash_price="0" durability_inital_value="-1" remaining_second="25200" refund_enable="true" />
<product id="7" term_contract="TS_10_HOURS" gm_price="10000" cash_price="0" durability_inital_value="-1" remaining_second="36000" refund_enable="true" />
<product id="8" term_contract="TS_10_HOURS" gm_price="0" cash_price="0" durability_inital_value="-1" remaining_second="36000" refund_enable="false" />
</pre>
<p><u>gm_price :</u> Prix fixé en "PEN" pour l'arme (Seulement "visuel")</p>
<p> </p>
<p><u>cash_price :</u> Prix fixé en "AP" pour l'arme (Seulement "visuel")</p>
<p> </p>
<p><u>durability_initial_value :</u> Durabilité interprété par le client maximum de l'arme (et ensuite comparé à la BDD)</p>
<p><span style="color:#ff0000;"><u><strong>EXPLICATION IMPORTANTE SUR CE POINT !</strong></u></span></p>
<p> </p>
<p>la durabilité fixé dans ce paramètre n'est pas celle que l'utilisateur aura à l'achat, comme je l'ai dis, elle sert juste de "comparatif"</p>
<p>Pourquoi ?</p>
<p> </p>
<p>Dans la BDD (nous allons le voir tout à l'heure) vous allez aussi fixé une durabilité (la même) à l'achat.</p>
<p>Le client quand à lui va comparer par rapport à la durabilité de base, qu'on a fixé dans le .x4 avec celle actuellement présente dans l'inventaire (une autre table)</p>
<p>Il fait cette comparaison pour une raison toute simple, <u>moins une arme a de durabilité (par rapport à celle de base, 2400) moins elle fera de dégâts !</u> (c'est le système de l'époque, on y peut rien)</p>
<p>Faites aussi très attention à ça, car côté émulateur, <span style="color:#ff0000;">il y a un autre bug</span> (Encore ?!)</p>
<p>Et oui, la réparation est impossible. Il va donc falloir ruser, afin d'éviter cette baisse des dégâts pour les joueurs (ou régler le problème directement dans l'émulateur)</p>
<p> </p>
<p><u>remaining_second :</u> Le temps avant suppression de l'arme (pareil, c'est à titre comparatif, avec la table de l'inventaire)</p>
<p> </p>
<p><u>refund_enable :</u> Définit si l'arme peut-être revendu ou non.</p>
<p></p><p><span style="font-size:36px;"><span style="color:#ff8c00;"><u>Etape 2 - On prépare l'ajout de l'arme dans la BDD depuis s4_shop.x4 !</u></span></span></p>
<p> </p>
<p>Dans cette deuxième étape, vous allez devoir ouvrir s4_shop.x4 et cherchez category_id="2" :</p>
<p> </p>
<p><img alt="1415115315-0152ca638b2.png" src="<base_url>/applications/sslimageproxy/interface/image.php?url=http://image.noelshack.com/fichiers/2014/45/1415115315-0152ca638b2.png"/></p>
<p> </p>
<p>Puis descendez jusqu'à trouver la sub_category_id="5", vous devriez tomber sur ça ! :</p>
<pre class="ipsCode prettyprint">
<sub_category id="5">
<!--투척무기-->
<item number="1">
<product id="1" dev="true" />
<product id="2" dev="true" />
</item>
<!--투척형 베러아이템-->
<item number="2101">
<product id="2" dev="true" />
<product id="3" dev="true" />
<product id="1" dev="true" />
</item>
</sub_category>
</pre>
<p>Oh mais ! L'arme est déjà présente ?! Que dois-je faire ?</p>
<p> </p>
<p>Pas de panique ! C'est normal, l'arme était déjà présente dans le client à cette époque, mais juste pas sortie.</p>
<p>Pour cela, S4L a mis au point cette petite variable => dev="true" afin de masquer l'arme dans le shop !</p>
<p>Vous n'avez qu'à remplacer celle ligne, afin de faire apparaître l'arme dans le shop (avec uniquement l'achat illimité)</p>
<pre class="ipsCode prettyprint">
<item number="1">
<product id="1" dev="true" />
</pre>
<p>en :</p>
<pre class="ipsCode prettyprint">
<item number="1">
<product id="1" dev="false" />
</pre>
<p>Voilà ! Maintenant on passe à la base de donnée ! </p>
<p> </p>
<p><span style="font-size:36px;"><span style="color:#ff8c00;"><u>Etape 3 - Configuration dans la base de donnée !</u></span></span></p>
<p> </p>
<p>Ouvrez navicat, connectez vous à votre réseau, et ouvrez la basse de donnée "game" :</p>
<p> </p>
<p><img alt="1415115716-cdedd43e352.png" src="<base_url>/applications/sslimageproxy/interface/image.php?url=http://image.noelshack.com/fichiers/2014/45/1415115716-cdedd43e352.png"/> => double cliquez sur la table "shop" afin de l'ouvrir</p>
<p> </p>
<p>Voici la ligne à ajouter (je vais expliquer pourquoi remplir ainsi) :</p>
<p> </p>
<p><img alt="1415115924-7697e5fcba2.png" src="<base_url>/applications/sslimageproxy/interface/image.php?url=http://image.noelshack.com/fichiers/2014/45/1415115924-7697e5fcba2.png"/><img alt="1415115924-971c2724812.png" src="<base_url>/applications/sslimageproxy/interface/image.php?url=http://image.noelshack.com/fichiers/2014/45/1415115924-971c2724812.png"/></p>
<p><u>ID :</u> ID de l'objet dans le shop, doit être unique !</p>
<p> </p>
<p>Type : Type d'achat (numérotez en 1,2,3 si vous avez plusieurs fois le même objet, mais avec différents product_id)</p>
<p> </p>
<p><u>Category :</u> Catégorie de l'arme (cf. s4_weapon.x4)</p>
<p> </p>
<p><u>SubCategory :</u> Sous-catégorie de l'arme (cf. s4_weapon.x4)</p>
<p> </p>
<p><u>ItemID :</u> ID de l'arme (cf. s4_weapon.x4)</p>
<p> </p>
<p><u>ProductID :</u> ID du "product_id" (mettez le même que celui présent dans s4_weapon & s4_shop, que l'affichage, et l'argent soutiré soient identiques)</p>
<p> </p>
<p><u>Price :</u> Prix en PEN soutiré à l'achat (Ce n'est pas le prix affiché, mais uniquement soutiré)</p>
<p> </p>
<p><u>Cash :</u> Prix en AP soutiré à l'achat (Idem)</p>
<p> </p>
<p><u>Energy :</u> Durabilité de l'objet donné à l'achat (cf. ce que j'ai expliqué à ce sujet, un peu plus haut)</p>
<p> </p>
<p><u>Time :</u> Temps restant avant la suppression de l'objet (cf. s4_weapon.x4)</p>
<p> </p>
<p><u>Comment :</u> Commentaire, à indiquer pour mieux vous repérer dans la table, uniquement </p>
<p></p><p>Voilà ! c'est terminé ! </p>
<p>Vous n'avez plus qu'à remplacer les s4_weapons.x4 et s4_shop.s4 de votre client, afin que tout soit bon ! (clic droit sur le fichier à remplacer, puis "replace")</p>
<p> </p>
<p><img alt="1415116453-191867deac2.png" src="<base_url>/applications/sslimageproxy/interface/image.php?url=http://image.noelshack.com/fichiers/2014/45/1415116453-191867deac2.png"/> ET N'OUBLIEZ PAS DE SAUVEGARDER ! =====> <img alt="1415116527-397389df282.png" src="<base_url>/applications/sslimageproxy/interface/image.php?url=http://image.noelshack.com/fichiers/2014/45/1415116527-397389df282.png"/></p>