Bonjour tout le monde !
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)
Avant toutes choses, il vous faut les pré-requis !
Pré-requis :
Un serveur installé et fonctionnel, ainsi qu'un client (cf. : )
Avoir pris connaissance de ce tutoriel (Pour extraire les ressources essentiellement => )
Navicat, pour éditer la base de donnée.
Notepad++ (ça sera plus simple qu'un simple bloc note)
Un petit peu de patience !
Etape 1 - Réglage des propriétés de l'arme :
Alors, dans un premier temps, vous allez avec notepad++ ouvrir le fichier s4_weapons.x4 (Dans notre exemple, nous utiliserons le "Minegun")
Utilisez la commande rapide une fois le fichier ouvert Ctrl + H afin d'ouvrir la barre de recherche, puis cherchez "Mine gun" :

Vous devriez maintenant voir un contenu similaire à celui-ci :
<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>
/!\ 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 :
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 :
<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" />
Petite explication brève des variables (non-vu dans le sujet sur la structure de weapons) :
term_contract : Ceci correspond à la durée d'utilisation de l'objet avant qu'il ne disparaisse de l'inventaire.
ATTENTION ! BUG REPÉRÉ !
Quel est le soucis rencontré avec l'émulateur à ce sujet actuellement ? (Petite astuce pour y faire face.)
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.)
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)
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.
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) :
<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" />
gm_price : Prix fixé en "PEN" pour l'arme (Seulement "visuel")
cash_price : Prix fixé en "AP" pour l'arme (Seulement "visuel")
durability_initial_value : Durabilité interprété par le client maximum de l'arme (et ensuite comparé à la BDD)
EXPLICATION IMPORTANTE SUR CE POINT !
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"
Pourquoi ?
Dans la BDD (nous allons le voir tout à l'heure) vous allez aussi fixé une durabilité (la même) à l'achat.
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)
Il fait cette comparaison pour une raison toute simple, moins une arme a de durabilité (par rapport à celle de base, 2400) moins elle fera de dégâts ! (c'est le système de l'époque, on y peut rien)
Faites aussi très attention à ça, car côté émulateur, il y a un autre bug (Encore ?!)
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)
remaining_second : Le temps avant suppression de l'arme (pareil, c'est à titre comparatif, avec la table de l'inventaire)
refund_enable : Définit si l'arme peut-être revendu ou non.
Etape 2 - On prépare l'ajout de l'arme dans la BDD depuis s4_shop.x4 !
Dans cette deuxième étape, vous allez devoir ouvrir s4_shop.x4 et cherchez category_id="2" :

Puis descendez jusqu'à trouver la sub_category_id="5", vous devriez tomber sur ça ! :
<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>
Oh mais ! L'arme est déjà présente ?! Que dois-je faire ?
Pas de panique ! C'est normal, l'arme était déjà présente dans le client à cette époque, mais juste pas sortie.
Pour cela, S4L a mis au point cette petite variable => dev="true" afin de masquer l'arme dans le shop !
Vous n'avez qu'à remplacer celle ligne, afin de faire apparaître l'arme dans le shop (avec uniquement l'achat illimité)
<item number="1">
<product id="1" dev="true" />
en :
<item number="1">
<product id="1" dev="false" />
Voilà ! Maintenant on passe à la base de donnée !
Etape 3 - Configuration dans la base de donnée !
Ouvrez navicat, connectez vous à votre réseau, et ouvrez la basse de donnée "game" :
 => double cliquez sur la table "shop" afin de l'ouvrir
Voici la ligne à ajouter (je vais expliquer pourquoi remplir ainsi) :

ID : ID de l'objet dans le shop, doit être unique !
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)
Category : Catégorie de l'arme (cf. s4_weapon.x4)
SubCategory : Sous-catégorie de l'arme (cf. s4_weapon.x4)
ItemID : ID de l'arme (cf. s4_weapon.x4)
ProductID : 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)
Price : Prix en PEN soutiré à l'achat (Ce n'est pas le prix affiché, mais uniquement soutiré)
Cash : Prix en AP soutiré à l'achat (Idem)
Energy : Durabilité de l'objet donné à l'achat (cf. ce que j'ai expliqué à ce sujet, un peu plus haut)
Time : Temps restant avant la suppression de l'objet (cf. s4_weapon.x4)
Comment : Commentaire, à indiquer pour mieux vous repérer dans la table, uniquement
Voilà ! c'est terminé !
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")
 ET N'OUBLIEZ PAS DE SAUVEGARDER ! =====> 