Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

[Script RunUO] Une bouteille d'huile pour lanterne

Par diOxygene le 30/1/2003 à 9:39:22 (#3131974)

Salut toutes et tous !

Je me suis essayé hier a créer un ptit item pour RunUO. Une bouteille d'huile pour remplir la lanterne et la refueller. J'ai fais quelques conneries au départ, et le truc des majuscules/minuscules (le C# fait la différence, a l'instar du c) m'as bien fait galérer (En Delphi, pas de blemes avec ça). Sans oublier les conneries de débutant ( m_Item.Deleted() a la place de m_Item.Delete() ). Bon, j'apprend pour l'instant le langage, et le script suivant est sans prétention. Ptetre qu'il pourra servir a quelqu'un, je l'espère.


// Oil for Lantern
// Make by OxyGene

using System;
using Server.Prompts;
using Server.Items;
using Server.Targeting;

namespace Server.Items
{
// Ici, on déclare le nom de l'Objet.
public class OilForLantern : Item
{
// Une variable qui peut contenir des unitées temporelles hh:mm:ss
private TimeSpan m_Reservoir;

// Ceci pour permettre a un GM de modifier la capacité d'une bouteille InGame
[CommandProperty( AccessLevel.GameMaster )]
public TimeSpan Reservoir
{
get { return m_Reservoir; }
set { m_Reservoir = value; }
}

// Ici, on déclare que l'Objet est constructible, on définit également
// les valeurs par défaut.
[Constructable]
public OilForLantern() : base( 0xE29 )
{
Weight = 0.3;
Name = "Huile pour lanterne";
Stackable = false;
Reservoir = TimeSpan.FromMinutes( 60 );
}

// Methode pour obtenir le numéro de série (????)
public OilForLantern( Serial serial ) : base( serial )
{
}

// Méthode pour écrire l'objet dans le fichier de sauvegarde.
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 );
writer.Write( (TimeSpan) Reservoir );
}

// Méthode pour récupérer les infos depuis le fichier de sauvegarde.
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
TimeSpan Reservoir = reader.ReadTimeSpan();
}

// Méthode définissant la réaction a un double clic.
public override void OnDoubleClick( Mobile from )
{
from.SendMessage( "Quelle lanterne voulez-vous remplir ?");
from.Target = new InternalTarget( this );
}


// Et la, le plus intéressant : Code décrivant l'action de l'objet.
// Je commente plus, parce que c'est pas trop compliqué.
private class InternalTarget : Target
{
private OilForLantern m_Item;

public InternalTarget( OilForLantern item ) : base( 1, false, TargetFlags.None )
{
m_Item = item;
}

protected override void OnTarget( Mobile from, object targeted )
{
string message;
TimeSpan difference;

if ( targeted == m_Item )
{
message = "Vous voulez remplir cette bouteille avec elle-même ???";
}
else if ( targeted is Lantern )
{
Lantern item = (Lantern)targeted;
if ( item.Burning )
{
message = "Impossible de remplir une lanterne allumée";
}
else if ( item.Duration == TimeSpan.FromMinutes( 20 ) )
{
message = "Cette lenterne est déjà pleine";
}
else
{
// On fait le bruit d'une création réussie d'une potion
from.PlaySound( 0x240 );
difference = TimeSpan.FromMinutes(20) - item.Duration;
if ( m_Item.Reservoir < difference )
{
item.Duration = item.Duration + m_Item.Reservoir;
message = "Cette lanterne a été partiellement remplie";

// m_Item.Delete() et pas m_Item.Deleted() !!! (Se cogne la tete sur l'écran).
m_Item.Delete();
}
else
{
item.Duration = TimeSpan.FromMinutes( 20 );
m_Item.Reservoir = m_Item.Reservoir - difference;
message = "Cette lanterne a été complètement remplie";
if ( m_Item.Reservoir == TimeSpan.FromMinutes(0) )
{
m_Item.Delete();
}
}

// La variable booleene BurnOut indique qu'une source de lumière
// a fini son temps et qu'elle ne peut plus être allumée.
// En la remettant a True, et vu que la variable Duration a été
// remise a 20mn, on peut de nouveau allumer la lanterne.
item.BurntOut = false;
}
}
else if ( targeted is OilForLantern )
{
OilForLantern item = (OilForLantern)targeted;
if ( item.Reservoir == TimeSpan.FromMinutes( 60 ) )
{
message = "Cette bouteille est déjà pleine";
}
else
{
from.PlaySound( 0x240 );
difference = TimeSpan.FromMinutes(60) - item.Reservoir;
if ( m_Item.Reservoir < difference )
{
item.Reservoir = item.Reservoir + m_Item.Reservoir;
message = "Cette bouteille a été partiellement remplie";
m_Item.Delete();
}
else
{
item.Reservoir = TimeSpan.FromMinutes( 60 );
m_Item.Reservoir = m_Item.Reservoir - difference;
if ( m_Item.Reservoir == TimeSpan.FromMinutes(0) )
{
m_Item.Delete();
}
message = "Cette bouteille a été complètement remplie";
}
}
}
else
{
message = "Ce n'est pas une lanterne";
}
from.SendMessage( message );
}
}
}
}



Ok, c'est un tout petit truc, mais bon, comme RunUo approche a grand pas de la version 1 (Version 15 now) je me suis dit qu'il était temps de commencer a apprendre a scripter avec, vu qu'il ne devrais plus y avoir de modification majeures... :rolleyes:
Enfin....j'espère....

================Avant postage===============
Rhaaaa !!!
le code devient pas lisible, la.
Le forum jol vire tout les espaces d'indentation. [Edit : Tu disais :D]
Il est plus beau, mon script.... :hardos:
Si vous l'utilisez, je vous conseille de réindenter, pour améliorer la lisibilité.

Par rituel le 30/1/2003 à 12:32:57 (#3132910)

C'est le premier script que je vois pour RunUO ... Ca à l'air marrant à scripter :D

* Espère pas dire une grosse connerie :D *

Par TyMor le 30/1/2003 à 12:36:10 (#3132934)

Ca ressemble un peu à du javascript d'ailleurs

Par rituel le 30/1/2003 à 13:15:58 (#3133234)

Oui au C et JAVA :D

Merci Rituel !

Par diOxygene le 30/1/2003 à 14:29:11 (#3133726)

Pour la remise en page ! :)
A propos de ce script, j'ai pas fini avec.
On peut créer des Items de Base. Avec des actions que l'on peut partager (C'est un langage objet, donc notion d'héritage ! :) )

Mon projet :
- Créer une Base Bouteille.
(Huile, vin, etc)

- Creer une Base Recipients
(Lanterne, ok, mais aussi verres, marmites, etc)

Pour verser, il y aurais 2 solutions :

1) Comme déjà programmé, on verse de la bouteille dans le récipient jusqu'a plus soif, ou jusqu'a épuisement de la bouteille.

2) On verse 1/4 de la bouteille par usage (Pour la cuisine).

Les récipients :
- Marmite, on y ajoute certains ingrédients très goûteux (Volcanous Ash, Demon bones, Head of gargoile, wing bat en grande quantité), ainsi que de l'huile de mandragore (1/4), de la poudre de perle noire (1/2) et on touille. Après (timer) 2 jours, on obtiens une marmite d'une potion a verser dans un Potion Keg et qui permet de se transformer en statue de pierre instantanément et pour une durée de 10 à 30 secondes. Avantage ? Si Gravement blessé, permet en se changeant en pierre de désinterreser la Bébète qu veux pas mourir....

- Verres, pour pouvoir servir du vin a des amis. Et lorsque la bouteille est vide, en disparaissant elle envoi un message divinatoire a l'un des convives au hasard.

- Fioles, mélanger des ingrédients pour obtenir des effets marrants. En fait, j'ai envie de créer un kit de l'apprenti alchimiste. Il devra tester ou faire tester ses potions... Pas de truc méchants, mais des potions de changement de sexe, de couleur de cheveux, de peau, des potions qui razent tout, qui téléportent le buveur a l'endroit ou il a bu, mais 10 pas plus loin. etc.. J'ai plein d'idées tordues comme ça.... ;)

Mais ça sera pas pour de suite, vu que je suis jeune marié, j'ai plein d'autre occupations maintenant ! :ange:

Je vais "Essayer" de faire tout ça, et je dit "Essayer" parce que ça va me servir a apprendre a programmer. Et ça va pas être de la tarte ! ;)

Par Edel [EdC] le 30/1/2003 à 16:12:06 (#3134422)

Sympa tout ca :-)

J'adore le concept de la marmitte, lol, ca peut creer des vocations de sorcieres, et relancer l'interet de cooking aussi ^^

Edel.

JOL Archives 1.0.1
@ JOL / JeuxOnLine