Nouveaux Types de Bois par Kertan Andilix
Post by Coordinateur Apoc - August 2, 2008 at 11:00 AM
Je met ici pour donner une idée, il suffira de répondre avec ta version à jour Kertan. L'Équipe pourra venir donner son avis ici sur ce qui devrait être changé. Je vais devoir parler avec Kel pour ce qui est du reste de la procédure ensuite.
hello,
Voila j'ai commencer il y a peu pour m'initier au scriptage runuo,.
Pour me pratiquer j'ai fait un script qui permet d'incorporer divers type de bois et je me suis dit qu'il pourrais surement allez sur crépuscule.
Je précise qu'il n'est pas à 100% terminer, me manque qu'une partie du coté craft.
Donc, il y à tout d'abord onze type de bois.
Ici de gauche à droite, du plus facile à bucher jusqu'au plus difficile:
-Chêne
-Érable
-Acajou
-Célestin
-Cazoul
-Brogilum
-Fagus
-Forestis
-Boskerin
-Waldon
-Silva
Nb: Les noms et les hues peuvent être facilement changé.
Nb2: Les noms viennent pour la plupart d'un vieux topic que j'ai trouvé sur le forum.
Il n'ont pas vraiment de différence sinon la couleur, je vais probablement donner des attributs spécial, quand je vais être rendu à travaillé sur les boucliers de bois et les arcs.
Sinon le forestis à comme particularité qu'il faut le chauffer pour travailler la buche (donc néssésite d'être près d'un four pour le couper en planche etc). Et encore la ça s'enlève facilement.
Si on rente dans les pourcentage:
Les trois bois communs (chêne, érable, acajou) ont chacun 20% d'être bucher, les 8 autres ont 40% et la dessus les deux derniers n'en ont que 1% chacun.
Sinon, pour éviter la disparition total des buches et des planches normales, j'ai gardée ses items, mais il ne sont plus buchable(ça ce dit?). Quand ont à des planches de chêne et qu'on construit des planches normales, ils se stacke ensemble sous le noms de planche, ce qui permet de faire des meubles avec le chêne et les planches qu'on avais avant.
Pour l'instant ça ressemble à ça. J'espère que ça t'intéresse.
Merci
Kertan
Post by Ex-Lumina - August 2, 2008 at 11:31 AM
Doucement maintenant. Je vais me citer sur de l'autre section du forum :
Le script des différents bois c'est pas totalement con, même si c'est déjà vu.
Je n'aime pas ce qui est proposé (du même arbre on peut avoir 10 couleurs flash différentes), même si je ne suis pas contre un raffinage de l'idée (par exemple bûcher sur un chêne donnerait du bois de chêne qui pourrait par exemple ensuite donner des attributs différents aux arcs qui en sort que le bois de pommier (qui ne se bûche d'ailleurs pas en ce moment)).
[...]
Post by Théodore de Lagarde, AdM - August 2, 2008 at 5:34 PM
Ça a l'air pas pire Kertan! Je trouve ça bien.
Mais c'est vrai que ça serait bizarre de bucher trois types de bois sur un même arbre
Mais dans le fond, on peut aussi dire ça du minage présentement. On peut miner des minerais différents sur un même endroit.
Aussi, il y a un problème. Les meubles du genre étagère et armoire (rouge) (fancy armoire), viennent déjà avec une autre couleur. Ils changeront de couleur aussi? Sauf pour le bois de base?
Post by Myrddin Emrys, CP - August 2, 2008 at 7:16 PM
Bon lumina, je suis justement rendu à ça : déterminer les couleurs, les noms, brefs les détails, j'avais pris ça un peu au hasard, juste pour démontrer l'idée.
si vous avez proposition la dessus je suis ouvert à tout
pour l'instant si on trouve de l'érable sur un arbre, on ne devrais que ramasser de l'érable, mais bon je crois avoir trouvé le moyen pour faire que chaque type d'arbre va donner un sorte de bois.
Post by Théodore de Lagarde, AdM - August 2, 2008 at 7:32 PM
Ça va être tannan, car il faudrait quasiment renommer chaque arbre du jeu pour le nom de ton bois.
Aussi, j'ai penser de faire que les bois les plus rares ne soient pas trouvable sur du bois ordinaire près de Systéria.
Il y a une espèce de foret dans le Grand nord où il y a de la neige. On pourrait y mettre un bois rare. Vu que c'est loin.
Post by Coordinateur Apoc - August 2, 2008 at 9:16 PM
Il faudrait faire un nouvel arbre pour chaque type de bois et ensuite l'équipe peut en placer un peu partout dans les forêts. Pour les différencier il y aurait le hue. Je n'ai jamais regardé le script de lumberjacking donc je ne sais pas comment ca pourrait fonctionner ainsi.
Post by Myrddin Emrys, CP - August 2, 2008 at 10:22 PM
la manière que j'ai trouvé fonctionne avec le itemid de chaque arbres je vais voir ce qu'on peux faire de ce coté, mais avant je voudrais avoir la liste finale des hues et des types de bois
je propose donc qu'on garde 8 type de bois:
les trois premiers et les 4, 5 et 6ième et deux autres plus rares à determiné
Post by Théodore de Lagarde, AdM - August 3, 2008 at 5:18 PM
On va pouvoir teindre les meubles? Sinon, ça risque de faire hrp, car avant on pouvait avec la teinture, et paf plus maintenant.
Faudrait des couleurs auxquelles on peut pas avoir avec le bac. si ce n'est pas déjà fait
Post by Myrddin Emrys, CP - August 17, 2008 at 2:14 AM
j'aimerais si possible votre avis sur les couleurs/nom/id de l'arbre
j'aime pas trop ça décidé par moi même
Post by Théodore de Lagarde, AdM - August 17, 2008 at 2:21 AM
Pour moi les noms importes peu.
Pour les couleurs, ça a l'air pas pire, mais ce serait bien d'avoir un bleu foncé et/ou un jaune doré.
Pour les ID, le mieux serait de prendre un ID d'arbre qui n'est pas utiliser sur Crépuscule, sinon on risque de trouver du bois rare un peu partout, ce que je trouverais bizarre.
Post by Myrddin Emrys, CP - August 23, 2008 at 2:44 AM
voila ce qui est ressorties de mais longue tergiversations:
9 bois
les six premiers des génériques, qui se trouvent un peu partout:
Chêne (normal)
Boulot (blanchâtre)
Acajou (rouge)
Ébène (noir)
Érable (brunâtre)
Cèdre (beige)
et les trois autres plus spécifiques
tropical (verdâtre dans la jungle)
Polaire (blanc au nord))
Aqualiens (bleus dans la cité des aquals et dans d'autre lieux liés à l'eau)
bon pour les deux derniers je vais avoir besoin de la collaborations des mjs (si vous êtes d'accord).
Parce que voyez vous va falloir rajouter ses deux types d'arbres la (je vous donnerais l'itemid) avant de statifier va falloir aussi changer le hues des arbres que vous aurais planter (je vous le communiquerais aussi)
as moins que ça ne dérange quelqu'un je me lance la dedans, faut que je détermine chaque arbre va avec lequel.
Post by Théodore de Lagarde, AdM - August 23, 2008 at 2:50 AM
Ça avance ton affaire! Mais oubli pas de mettre ça compatible avec mes script de meubles.
Post by Myrddin Emrys, CP - August 23, 2008 at 2:58 AM
ça c'est la job de apoc il va devoir tout rajouter les meubles dans la table des items qui gardes le hues de sa ressources.
Post by Théodore de Lagarde, AdM - August 23, 2008 at 2:59 AM
pourquoi tu le fait pas toi-même?
Post by Myrddin Emrys, CP - August 23, 2008 at 3:01 AM
j'ai pas tout les noms des meubles, donc tout les meubles qui ont été rajoutés japoc va devoir les rajoutés
Post by Théodore de Lagarde, AdM - August 23, 2008 at 3:07 AM
ceux de willy + les miens.
Et j'en ai pas mal beaucoup.
J'en ajouterais encore plus si j'arrivais à faire marcher cette fichue commande... (bon ok, j'arrête de chialer)
Post by Myrddin Emrys, CP - August 23, 2008 at 7:54 AM
WOOHOO!!!!
j'ai presque finit le script! Il ne reste plus qu'a balancer les arcs ajouter les meubles de bases dans colored item table et as décider les hues et les arbres de chaque bois.
donc dans deux trois jours gros max je suis prêt à vous donner le script
Post by Myrddin Emrys, CP - August 23, 2008 at 10:08 PM
retour sur terre:
il me reste juste à décider les arbres pour chaque types de bois
mais... j'avais pas penser au addon, donc la j'ai essayer de bidouiller que les addons prennent les couleurs de la ressources dans lesquels elle sont fait, mais bon ça marche pas du tonnerre pour l'instant j'ai juste réussis à faire que le papier (qui permet de mettre le addon) soit de la couleur de la ressource. Si quelqu'un peux m'aider
Post by Théodore de Lagarde, AdM - August 23, 2008 at 10:42 PM
fait pas ça pour les addons kertan.
Chez moi j'ai "créé" une nouvelle sorte de addon dont le double click marche. J'avais pas le choix. donc va falloir les addon2, comme je l'ai appeler, sinon ça marchera pas ton affaire.
Edit: Autre problème, les addon2 que je créé, il sont craftable d'abord par les deed. Donc à moin de mettre la couleur du bois sur le deed, tu risque d'avoir de la misère à faire en sorte que la couleur du bois se transfère sur les addon2, une fois créé par le deed.
Post by Myrddin Emrys, CP - August 23, 2008 at 10:47 PM
Edit: Autre problème, les addon2 que je créé, il sont craftable d'abord par les deed. Donc à moin de mettre la couleur du bois sur le deed, tu risque d'avoir de la misère à faire en sorte que la couleur du bois se transfère sur les addon2, une fois créé par le deed.
c'est exactement ce que je suis en train d'essayer de faire
Post by Théodore de Lagarde, AdM - August 23, 2008 at 11:01 PM
Ça donne rien que tu fasse teindable les addon normal. Je les ai tous modifier à quelquepart, ceux craftable. Donc ils sont tous addon2
Post by Myrddin Emrys, CP - August 23, 2008 at 11:09 PM
sauf que si je suis capable de teindre addon 1, je vais juste avoir à transférer quelques trucs pour que ça marche sur addon 2
Post by Théodore de Lagarde, AdM - August 23, 2008 at 11:14 PM
pas transféré, juste ajouter un "2" à la fin de toutes tes affaires qui en auront besoin.
Edit: C'est pas pour te décourager, mais il y a un autre problème:
quand on "flip" l'objet, ça le supprime et ça en créé un autre. Il y a un moyen de faire que ça garde le même hue que celui précédemment?
Post by Myrddin Emrys, CP - August 23, 2008 at 11:26 PM
si je réussis mon trucs, je vais te le dire (parce que c'est le même principe)
Post by Myrddin Emrys, CP - August 24, 2008 at 3:29 AM
petite question idiote...
ça dérange quelqu'un si je ne fait pas ce petit ajout,
l'inconvénient c'est que les gms vont devoirs eux même changer la couleurs du addon, mais au moins ça va marcher...
simplement un .set resource Aqualiens à faire pour changer la couleur
Post by Théodore de Lagarde, AdM - August 24, 2008 at 4:27 AM
heu.. quoi?
t'as qu'à faire que ça ne touche que les nouveaux objets, pas ceux déjà en jeu. Comme je le fais.
Post by Myrddin Emrys, CP - August 24, 2008 at 4:38 AM
ce que je dit c'est que je ne suis pas capable de faire que les addons prennent la couleur des ressources,
donc si ça dérange quelqu'un que je ne le fasse pas fait moi signe
parce que sinon tout est fin prêt pour le reste
script completion: 99%
(le 1% c'est un trucs à copier coller dans tout les scripts des meubles)
edit:
script completion 100%
Post by Théodore de Lagarde, AdM - August 24, 2008 at 5:01 AM
tant qu'à moi, les addons c'est la moitié des meubles, surtout avec ceux que j'ajoute.
Je sais pas si ça peu aider, mais moi pour les addons je fais ça pour que je puisse les faire bougeable et je peux les renommer:
Tu peux peut-être faire quelque chose genre ac.Hue
[Constructable]
public SmallBedEastAddon2()
{
AddonComponent2 ac;
ac = new AddonComponent2(0xA5D);
ac.Movable = true;
ac.Name = "Petit lit";
AddComponent2(ac, 0, 0, 0);
AddonComponent2 ac2;
ac2 = new AddonComponent2(0xA62);
ac2.Movable = true;
ac2.Name = "Petit lit";
AddComponent2(ac2, 1, 0, 0);
}
EDIT: LOL! Tu t'es inscris sur RunUo.com!
Je devrais peut-être le faire aussi...
Post by Myrddin Emrys, CP - August 24, 2008 at 5:03 AM
j'pense pas, le problème avec mon trucs c'est qu'il faut qu'il aille chercher la ressource ou le hue de son addon deed
Post by Théodore de Lagarde, AdM - August 24, 2008 at 5:04 AM
arrange toi pour le hue du deed soit égale au hue du addon créé
Post by Myrddin Emrys, CP - August 29, 2008 at 2:17 AM
bon voila, j'en appelle au scripteur plus avancé que moi: vous avez une idée de comment je pourrait faire que le hue se garde avec le addon?
Post by Théodore de Lagarde, AdM - August 29, 2008 at 2:48 AM
Montre nous de qui t'es scriptes ont l'air pour qu'on puisse savoir se qui se passe, et par le fait même poste les erreures si ton serveur part pas.
Post by Myrddin Emrys, CP - August 29, 2008 at 4:22 AM
Premièrement le script de base addon
using System;
using System.Collections;
using Server;
using Server.Multis;
using Server.Regions;
namespace Server.Items
{
\tpublic enum AddonFitResult
\t{
\t\tValid,
\t\tBlocked,
\t\tNotInHouse,
\t\tDoorsNotClosed,
\t\tDoorTooClose,
\t\tNoWall
\t}
\tpublic interface IAddon
\t{
\t\tItem Deed{ get; }
\t\tbool CouldFit( IPoint3D p, Map map );
\t}
\tpublic abstract class BaseAddon : Item, IChopable, IAddon
\t{
\t\tprivate ArrayList m_Components;
\t\tpublic void AddComponent( AddonComponent c, int x, int y, int z )
\t\t{
\t\t\tif ( Deleted )
\t\t\t\treturn;
\t\t\tm_Components.Add( c );
\t\t\tc.Addon = this;
\t\t\tc.Offset = new Point3D( x, y, z );
\t\t\tc.MoveToWorld( new Point3D( X + x, Y + y, Z + z ), Map );
\t\t}
\t\tpublic BaseAddon() : base( 1 )
\t\t{
\t\t\tMovable = false;
\t\t\tVisible = false;
\t\t\tm_Components = new ArrayList();
\t\t}
\t\tpublic virtual bool RetainDeedHue{ get{ return true; } }
\t\tpublic void OnChop( Mobile from )
\t\t{
\t\t\tBaseHouse house = BaseHouse.FindHouseAt( this );
\t\t\tif ( house != null && house.IsOwner( from ) && house.Addons.Contains( this ) )
\t\t\t{
\t\t\t\tEffects.PlaySound( GetWorldLocation(), Map, 0x3B3 );
\t\t\t\tfrom.SendLocalizedMessage( 500461 ); // You destroy the item.
\t\t\t\tint hue = 0;
\t\t\t\tif ( RetainDeedHue )
\t\t\t\t{
\t\t\t\t\tfor ( int i = 0; hue == 0 && i < m_Components.Count; ++i )
\t\t\t\t\t{
\t\t\t\t\t\tAddonComponent c = (AddonComponent)m_Components[i];
\t\t\t\t\t\tif ( c.Hue != 0 )
\t\t\t\t\t\t\thue = c.Hue;
\t\t\t\t\t}
\t\t\t\t}
\t\t\t\tDelete();
\t\t\t\thouse.Addons.Remove( this );
\t\t\t\tBaseAddonDeed deed = Deed;
\t\t\t\tif ( deed != null )
\t\t\t\t{
\t\t\t\t\tif ( RetainDeedHue )
\t\t\t\t\t\tdeed.Hue = hue;
\t\t\t\t\tfrom.AddToBackpack( deed );
\t\t\t\t}
\t\t\t}
\t\t}
\t\tpublic virtual BaseAddonDeed Deed{ get{ return null; } }
\t\tItem IAddon.Deed
\t\t{
\t\t\tget{ return this.Deed; }
\t\t}
\t\tpublic ArrayList Components
\t\t{
\t\t\tget
\t\t\t{
\t\t\t\treturn m_Components;
\t\t\t}
\t\t}
\t\tpublic BaseAddon( Serial serial ) : base( serial )
\t\t{
\t\t}
\t\tpublic bool CouldFit( IPoint3D p, Map map )
\t\t{
\t\t\tArrayList houses = null;
\t\t\treturn ( CouldFit( p, map, null, ref houses ) == AddonFitResult.Valid );
\t\t}
\t\tpublic AddonFitResult CouldFit( IPoint3D p, Map map, Mobile from, ref ArrayList houseList )
\t\t{
\t\t\tif ( Deleted )
\t\t\t\treturn AddonFitResult.Blocked;
\t\t\tArrayList houses = new ArrayList();
\t\t\tforeach ( AddonComponent c in m_Components )
\t\t\t{
\t\t\t\tPoint3D p3D = new Point3D( p.X + c.Offset.X, p.Y + c.Offset.Y, p.Z + c.Offset.Z );
\t\t\t\tif ( !map.CanFit( p3D.X, p3D.Y, p3D.Z, c.ItemData.Height, false, true, ( c.Z == 0 ) ) )
\t\t\t\t\treturn AddonFitResult.Blocked;
\t\t\t\telse if ( !CheckHouse( from, p3D, map, c.ItemData.Height, houses ) )
\t\t\t\t\treturn AddonFitResult.NotInHouse;
\t\t\t\tif ( c.NeedsWall )
\t\t\t\t{
\t\t\t\t\tPoint3D wall = c.WallPosition;
\t\t\t\t\tif ( !IsWall( p3D.X + wall.X, p3D.Y + wall.Y, p3D.Z + wall.Z, map ) )
\t\t\t\t\t\treturn AddonFitResult.NoWall;
\t\t\t\t}
\t\t\t}
\t\t\tforeach ( BaseHouse house in houses )
\t\t\t{
\t\t\t\tArrayList doors = house.Doors;
\t\t\t\tfor ( int i = 0; i < doors.Count; ++i )
\t\t\t\t{
\t\t\t\t\tBaseDoor door = doors[i] as BaseDoor;
\t\t\t\t\tif ( door != null && door.Open )
\t\t\t\t\t\treturn AddonFitResult.DoorsNotClosed;
\t\t\t\t\tPoint3D doorLoc = door.GetWorldLocation();
\t\t\t\t\tint doorHeight = door.ItemData.CalcHeight;
\t\t\t\t\tforeach ( AddonComponent c in m_Components )
\t\t\t\t\t{
\t\t\t\t\t\tPoint3D addonLoc = new Point3D( p.X + c.Offset.X, p.Y + c.Offset.Y, p.Z + c.Offset.Z );
\t\t\t\t\t\tint addonHeight = c.ItemData.CalcHeight;
\t\t\t\t\t\tif ( Utility.InRange( doorLoc, addonLoc, 1 ) && (addonLoc.Z == doorLoc.Z || ((addonLoc.Z + addonHeight) > doorLoc.Z && (doorLoc.Z + doorHeight) > addonLoc.Z)) )
\t\t\t\t\t\t\treturn AddonFitResult.DoorTooClose;
\t\t\t\t\t}
\t\t\t\t}
\t\t\t}
\t\t\thouseList = houses;
\t\t\treturn AddonFitResult.Valid;
\t\t}
\t\tpublic bool CheckHouse( Mobile from, Point3D p, Map map, int height, ArrayList list )
\t\t{
\t\t\tif ( from == null || from.AccessLevel >= AccessLevel.GameMaster )
\t\t\t\treturn true;
\t\t\tBaseHouse house = BaseHouse.FindHouseAt( p, map, height );
\t\t\tif ( house == null || !house.IsOwner( from ) )
\t\t\t\treturn false;
\t\t\tif ( !list.Contains( house ) )
\t\t\t\tlist.Add( house );
\t\t\treturn true;
\t\t}
\t\tpublic static bool IsWall( int x, int y, int z, Map map )
\t\t{
\t\t\tif ( map == null )
\t\t\t\treturn false;
\t\t\tTile[] tiles = map.Tiles.GetStaticTiles( x, y, true );
\t\t\tfor ( int i = 0; i < tiles.Length; ++i )
\t\t\t{
\t\t\t\tTile t = tiles[i];
\t\t\t\tItemData id = TileData.ItemTable[t.ID & 0x3FFF];
\t\t\t\tif ( (id.Flags & TileFlag.Wall) != 0 && (z + 16) > t.Z && (t.Z + t.Height) > z )
\t\t\t\t\treturn true;
\t\t\t}
\t\t\treturn false;
\t\t}
\t\tpublic virtual void OnComponentLoaded( AddonComponent c )
\t\t{
\t\t}
\t\tpublic override void OnLocationChange( Point3D oldLoc )
\t\t{
\t\t\tif ( Deleted )
\t\t\t\treturn;
\t\t\tforeach ( AddonComponent c in m_Components )
\t\t\t\tc.Location = new Point3D( X + c.Offset.X, Y + c.Offset.Y, Z + c.Offset.Z );
\t\t}
\t\tpublic override void OnMapChange()
\t\t{
\t\t\tif ( Deleted )
\t\t\t\treturn;
\t\t\tforeach ( AddonComponent c in m_Components )
\t\t\t\tc.Map = Map;
\t\t}
\t\tpublic override void OnAfterDelete()
\t\t{
\t\t\tbase.OnAfterDelete();
\t\t\tforeach ( AddonComponent c in m_Components )
\t\t\t\tc.Delete();
\t\t}
\t\tpublic virtual bool ShareHue{ get{ return true; } }
\t\t[Hue, CommandProperty( AccessLevel.GameMaster )]
\t\tpublic override int Hue
\t\t{
\t\t\tget
\t\t\t{
\t\t\t\treturn base.Hue;
\t\t\t}
\t\t\tset
\t\t\t{
\t\t\t\tif ( base.Hue != value )
\t\t\t\t{
\t\t\t\t\tbase.Hue = value;
\t\t\t\t\tif ( !Deleted && this.ShareHue && m_Components != null )
\t\t\t\t\t{
\t\t\t\t\t\tforeach ( AddonComponent c in m_Components )
\t\t\t\t\t\t\tc.Hue = value;
\t\t\t\t\t}
\t\t\t\t}
\t\t\t}
\t\t}
\t\tpublic override void Serialize( GenericWriter writer )
\t\t{
\t\t\tbase.Serialize( writer );
\t\t\twriter.Write( (int) 0 ); // version
\t\t\twriter.WriteItemList( m_Components );
\t\t}
\t\tpublic override void Deserialize( GenericReader reader )
\t\t{
\t\t\tbase.Deserialize( reader );
\t\t\tint version = reader.ReadInt();
\t\t\tswitch ( version )
\t\t\t{
\t\t\t\tcase 0:
\t\t\t\t{
\t\t\t\t\tm_Components = reader.ReadItemList();
\t\t\t\t\tbreak;
\t\t\t\t}
\t\t\t}
\t\t}
\t}
}
deuxièmement le script de base addon component
using System;
using Server;
namespace Server.Items
{
\t[Server.Engines.Craft.Anvil]
\tpublic class AnvilComponent : AddonComponent
\t{
\t\t[Constructable]
\t\tpublic AnvilComponent( int itemID ) : base( itemID )
\t\t{
\t\t}
\t\tpublic AnvilComponent( Serial serial ) : base( serial )
\t\t{
\t\t}
\t\tpublic override void Serialize( GenericWriter writer )
\t\t{
\t\t\tbase.Serialize( writer );
\t\t\twriter.Write( (int) 0 ); // version
\t\t}
\t\tpublic override void Deserialize( GenericReader reader )
\t\t{
\t\t\tbase.Deserialize( reader );
\t\t\tint version = reader.ReadInt();
\t\t}
\t}
\t[Server.Engines.Craft.Forge]
\tpublic class ForgeComponent : AddonComponent
\t{
\t\t[Constructable]
\t\tpublic ForgeComponent( int itemID ) : base( itemID )
\t\t{
\t\t}
\t\tpublic ForgeComponent( Serial serial ) : base( serial )
\t\t{
\t\t}
\t\tpublic override void Serialize( GenericWriter writer )
\t\t{
\t\t\tbase.Serialize( writer );
\t\t\twriter.Write( (int) 0 ); // version
\t\t}
\t\tpublic override void Deserialize( GenericReader reader )
\t\t{
\t\t\tbase.Deserialize( reader );
\t\t\tint version = reader.ReadInt();
\t\t}
\t}
\tpublic class LocalizedAddonComponent : AddonComponent
\t{
\t\tprivate int m_LabelNumber;
\t\t[CommandProperty( AccessLevel.GameMaster )]
\t\tpublic int Number
\t\t{
\t\t\tget{ return m_LabelNumber; }
\t\t\tset{ m_LabelNumber = value; InvalidateProperties(); }
\t\t}
\t\tpublic override int LabelNumber{ get{ return m_LabelNumber; } }
\t\t[Constructable]
\t\tpublic LocalizedAddonComponent( int itemID, int labelNumber ) : base( itemID )
\t\t{
\t\t\tm_LabelNumber = labelNumber;
\t\t}
\t\tpublic LocalizedAddonComponent( Serial serial ) : base( serial )
\t\t{
\t\t}
\t\tpublic override void Serialize( GenericWriter writer )
\t\t{
\t\t\tbase.Serialize( writer );
\t\t\twriter.Write( (int) 0 ); // version
\t\t\twriter.Write( (int) m_LabelNumber );
\t\t}
\t\tpublic override void Deserialize( GenericReader reader )
\t\t{
\t\t\tbase.Deserialize( reader );
\t\t\tint version = reader.ReadInt();
\t\t\tswitch ( version )
\t\t\t{
\t\t\t\tcase 0:
\t\t\t\t{
\t\t\t\t\tm_LabelNumber = reader.ReadInt();
\t\t\t\t\tbreak;
\t\t\t\t}
\t\t\t}
\t\t}
\t}
\tpublic class AddonComponent : Item, IChopable
\t{
\t\tprivate Point3D m_Offset;
\t\tprivate BaseAddon m_Addon;
\t\t[CommandProperty( AccessLevel.GameMaster )]
\t\tpublic BaseAddon Addon
\t\t{
\t\t\tget
\t\t\t{
\t\t\t\treturn m_Addon;
\t\t\t}
\t\t\tset
\t\t\t{
\t\t\t\tm_Addon = value;
\t\t\t}
\t\t}
\t\t[CommandProperty( AccessLevel.GameMaster )]
\t\tpublic Point3D Offset
\t\t{
\t\t\tget
\t\t\t{
\t\t\t\treturn m_Offset;
\t\t\t}
\t\t\tset
\t\t\t{
\t\t\t\tm_Offset = value;
\t\t\t}
\t\t}
\t
\t\tpublic virtual bool NeedsWall{ get{ return false; } }
\t\tpublic virtual Point3D WallPosition{ get{ return Point3D.Zero; } }
\t\t[Constructable]
\t\tpublic AddonComponent( int itemID ) : base( itemID )
\t\t{
\t\t\tMovable = false;
\t\t\tApplyLightTo( this );
\t\t}
\t\tpublic AddonComponent( Serial serial ) : base( serial )
\t\t{
\t\t}
\t\tpublic void OnChop( Mobile from )
\t\t{
\t\t\tif ( m_Addon != null && from.InRange( GetWorldLocation(), 3 ) )
\t\t\t\tm_Addon.OnChop( from );
\t\t\telse
\t\t\t\tfrom.SendLocalizedMessage( 500446 ); // That is too far away.
\t\t}
\t\tpublic override void OnLocationChange( Point3D old )
\t\t{
\t\t\tif ( m_Addon != null )
\t\t\t\tm_Addon.Location = new Point3D( X - m_Offset.X, Y - m_Offset.Y, Z - m_Offset.Z );
\t\t}
\t\tpublic override void OnMapChange()
\t\t{
\t\t\tif ( m_Addon != null )
\t\t\t\tm_Addon.Map = Map;
\t\t}
\t\tpublic override void OnAfterDelete()
\t\t{
\t\t\tbase.OnAfterDelete();
\t\t\tif ( m_Addon != null )
\t\t\t\tm_Addon.Delete();
\t\t}
\t\tpublic override void Serialize( GenericWriter writer )
\t\t{
\t\t\tbase.Serialize( writer );
\t\t\twriter.Write( (int) 0 ); // version
\t\t\twriter.Write( m_Addon );
\t\t\twriter.Write( m_Offset );
\t\t}
\t\tpublic override void Deserialize( GenericReader reader )
\t\t{
\t\t\tbase.Deserialize( reader );
\t\t\tint version = reader.ReadInt();
\t\t\tswitch ( version )
\t\t\t{
\t\t\t\tcase 0:
\t\t\t\t{
\t\t\t\t\tm_Addon = reader.ReadItem() as BaseAddon;
\t\t\t\t\tm_Offset = reader.ReadPoint3D();
\t\t\t\t\tif ( m_Addon != null )
\t\t\t\t\t\tm_Addon.OnComponentLoaded( this );
\t\t\t\t\tApplyLightTo( this );
\t\t\t\t\tbreak;
\t\t\t\t}
\t\t\t}
\t\t}
\t\tpublic static void ApplyLightTo( Item item )
\t\t{
\t\t\tif ( (item.ItemData.Flags & TileFlag.LightSource) == 0 )
\t\t\t\treturn; // not a light source
\t\t\tint itemID = item.ItemID;
\t\t\tfor ( int i = 0; i < m_Entries.Length; ++i )
\t\t\t{
\t\t\t\tLightEntry entry = m_Entries[i];
\t\t\t\tint[] toMatch = entry.m_ItemIDs;
\t\t\t\tbool contains = false;
\t\t\t\tfor ( int j = 0; !contains && j < toMatch.Length; ++j )
\t\t\t\t\tcontains = ( itemID == toMatch[j] );
\t\t\t\tif ( contains )
\t\t\t\t{
\t\t\t\t\titem.Light = entry.m_Light;
\t\t\t\t\treturn;
\t\t\t\t}
\t\t\t}
\t\t}
\t\tprivate static LightEntry[] m_Entries = new LightEntry[]
\t\t\t{
\t\t\t\tnew LightEntry( LightType.WestSmall, 1122, 1123, 1124, 1141, 1142, 1143, 1144, 1145, 1146, 2347, 2359, 2360, 2361, 2362, 2363, 2364, 2387, 2388, 2389, 2390, 2391, 2392 ),
\t\t\t\tnew LightEntry( LightType.NorthSmall, 1131, 1133, 1134, 1147, 1148, 1149, 1150, 1151, 1152, 2352, 2373, 2374, 2375, 2376, 2377, 2378, 2401, 2402, 2403, 2404, 2405, 2406 ),
\t\t\t\tnew LightEntry( LightType.Circle300, 6526, 6538 )
\t\t\t};
\t\tprivate class LightEntry
\t\t{
\t\t\tpublic LightType m_Light;
\t\t\tpublic int[] m_ItemIDs;
\t\t\tpublic LightEntry( LightType light, params int[] itemIDs )
\t\t\t{
\t\t\t\tm_Light = light;
\t\t\t\tm_ItemIDs = itemIDs;
\t\t\t}
\t\t}
\t}
}
troisièmement le script de base addon deed
using System;
using System.Collections;
using Server;
using Server.Targeting;
namespace Server.Items
{
\t[Flipable( 0x14F0, 0x14EF )]
\tpublic abstract class BaseAddonDeed : Item
\t{
\t\tpublic abstract BaseAddon Addon{ get; }
\t\tpublic BaseAddonDeed() : base( 0x14F0 )
\t\t{
\t\t\tWeight = 1.0;
\t\t\tif ( !Core.AOS )
\t\t\t\tLootType = LootType.Newbied;
\t\t}
\t\tpublic BaseAddonDeed( Serial serial ) : base( serial )
\t\t{
\t\t}
\t\tpublic override void Serialize( GenericWriter writer )
\t\t{
\t\t\tbase.Serialize( writer );
\t\t\twriter.Write( (int) 0 ); // version
\t\t}
\t\tpublic override void Deserialize( GenericReader reader )
\t\t{
\t\t\tbase.Deserialize( reader );
\t\t\tint version = reader.ReadInt();
\t\t\tif ( Weight == 0.0 )
\t\t\t\tWeight = 1.0;
\t\t}
\t\tpublic override void OnDoubleClick( Mobile from )
\t\t{
\t\t\tif ( IsChildOf( from.Backpack ) )
\t\t\t\tfrom.Target = new InternalTarget( this );
\t\t\telse
\t\t\t\tfrom.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
\t\t}
\t\tprivate class InternalTarget : Target
\t\t{
\t\t\tprivate BaseAddonDeed m_Deed;
\t\t\tpublic InternalTarget( BaseAddonDeed deed ) : base( -1, true, TargetFlags.None )
\t\t\t{
\t\t\t\tm_Deed = deed;
\t\t\t\tCheckLOS = false;
\t\t\t}
\t\t\tprotected override void OnTarget( Mobile from, object targeted )
\t\t\t{
\t\t\t\tIPoint3D p = targeted as IPoint3D;
\t\t\t\tMap map = from.Map;
\t\t\t\tif ( p == null || map == null || m_Deed.Deleted )
\t\t\t\t\treturn;
\t\t\t\tif ( m_Deed.IsChildOf( from.Backpack ) )
\t\t\t\t{
\t\t\t\t\tBaseAddon addon = m_Deed.Addon;
\t\t\t\t\tServer.Spells.SpellHelper.GetSurfaceTop( ref p );
\t\t\t\t\tArrayList houses = null;
\t\t\t\t\tAddonFitResult res = addon.CouldFit( p, map, from, ref houses );
\t\t\t\t\tif ( res == AddonFitResult.Valid )
\t\t\t\t\t\taddon.MoveToWorld( new Point3D( p ), map );
\t\t\t\t\telse if ( res == AddonFitResult.Blocked )
\t\t\t\t\t\tfrom.SendLocalizedMessage( 500269 ); // You cannot build that there.
\t\t\t\t\telse if ( res == AddonFitResult.NotInHouse )
\t\t\t\t\t\tfrom.SendLocalizedMessage( 500274 ); // You can only place this in a house that you own!
\t\t\t\t\telse if ( res == AddonFitResult.DoorsNotClosed )
\t\t\t\t\t\tfrom.SendMessage( "You must close all house doors before placing this." );
\t\t\t\t\telse if ( res == AddonFitResult.DoorTooClose )
\t\t\t\t\t\tfrom.SendLocalizedMessage( 500271 ); // You cannot build near the door.
\t\t\t\t\telse if ( res == AddonFitResult.NoWall )
\t\t\t\t\t\tfrom.SendLocalizedMessage( 500268 ); // This object needs to be mounted on something.
\t\t\t\t\t
\t\t\t\t\tif ( res == AddonFitResult.Valid )
\t\t\t\t\t{
\t\t\t\t\t\tm_Deed.Delete();
\t\t\t\t\t\tif ( houses != null )
\t\t\t\t\t\t{
\t\t\t\t\t\t\tforeach ( Server.Multis.BaseHouse h in houses )
\t\t\t\t\t\t\t\th.Addons.Add( addon );
\t\t\t\t\t\t}
\t\t\t\t\t}
\t\t\t\t\telse
\t\t\t\t\t{
\t\t\t\t\t\taddon.Delete();
\t\t\t\t\t}
\t\t\t\t}
\t\t\t\telse
\t\t\t\t{
\t\t\t\t\tfrom.SendLocalizedMessage( 1042001 ); // That must be in your pack for you to use it.
\t\t\t\t}
\t\t\t}
\t\t}
\t}
}
et quatrième le script du addon que je teste dessus
using System;
using Server;
namespace Server.Items
{
\tpublic class WaterTroughSouthAddon : BaseAddon, IWaterSource
\t{
\t\tpublic override BaseAddonDeed Deed{ get{ return new WaterTroughSouthDeed(); } }
\t\tpublic WaterTroughSouthDeed m_Deed;
\t\t
\t\t[Constructable]
\t\tpublic WaterTroughSouthAddon()
\t\t{
\t\t\tAddComponent( new AddonComponent( 0xB43 ), 0, 0, 0 );
\t\t\tAddComponent( new AddonComponent( 0xB44 ), 1, 0, 0 );
\t\t\t
\t\t\tif (m_Deed.Hue != 0)
\t\t\t\tm_Deed.Hue = Hue;
\t\t}
\t\tpublic WaterTroughSouthAddon( Serial serial ) : base( serial )
\t\t{
\t\t}
\t\tpublic override void Serialize( GenericWriter writer )
\t\t{
\t\t\tbase.Serialize( writer );
\t\t\twriter.Write( (int) 0 ); // version
\t\t}
\t\tpublic override void Deserialize( GenericReader reader )
\t\t{
\t\t\tbase.Deserialize( reader );
\t\t\tint version = reader.ReadInt();
\t\t}
\t\tpublic int Quantity
\t\t{
\t\t\tget{ return 500; }
\t\t\tset{}
\t\t}
\t}
\tpublic class WaterTroughSouthDeed : BaseAddonDeed
\t{
\t\tpublic override BaseAddon Addon{ get{ return new WaterTroughSouthAddon(); } }
\t\tpublic override int LabelNumber{ get{ return 1044350; } } // water trough (south)
\t\t[Constructable]
\t\tpublic WaterTroughSouthDeed()
\t\t{
\t\t}
\t\tpublic WaterTroughSouthDeed( Serial serial ) : base( serial )
\t\t{
\t\t}
\t\tpublic override void Serialize( GenericWriter writer )
\t\t{
\t\t\tbase.Serialize( writer );
\t\t\twriter.Write( (int) 0 ); // version
\t\t}
\t\tpublic override void Deserialize( GenericReader reader )
\t\t{
\t\t\tbase.Deserialize( reader );
\t\t\tint version = reader.ReadInt();
\t\t}
\t}
}
et la le message de quand le serveur crash, je suppose qu'il crash car plusieurs trucs lui dises un hue, mais je sais pas trop quoi deleter:
RunUO Version 1.0.0, Build 36918
Operating System: Microsoft Windows NT 5.1.2600.0
.NET Framework: 1.1.4322.2407
Time: 2008-08-28 18:12:04
Mobiles: 2314
Items: 92111
Clients:
- Count: 1
- 127.0.0.1: (account = ) (mobile = 0x92F 'opakoi')
Exception:
System.NullReferenceException: Object reference not set to an instance of an object.
at Server.Items.BaseAddon.CouldFit(IPoint3D p, Map map, Mobile from, ArrayList& houseList)
at Server.Items.InternalTarget.OnTarget(Mobile from, Object targeted)
at Server.Targeting.Target.Invoke(Mobile from, Object targeted)
at Server.Network.PacketHandlers.TargetResponse(NetState state, PacketReader pvSrc)
at Server.Network.MessagePump.HandleReceive(NetState ns)
at Server.Network.MessagePump.Slice()
at Server.Core.Main(String[] args)
Post by Théodore de Lagarde, AdM - August 29, 2008 at 4:27 AM
Je vais regarder une coupe d'affaires.
Sache aussi, Kertan, que j'ai fait un BaseAddon2, AddonComponent2, etc. Donc ce que tu fais, ça s'appliquera pas aux miens.
Mais avant que j'essaye, Kertan, j'aimererais savoir si tu ai capable de donner le hue au deed pour commencer. et si c'est après que ça bug etc
Post by Myrddin Emrys, CP - August 29, 2008 at 4:34 AM
le deed à le bon hue
Post by Théodore de Lagarde, AdM - August 29, 2008 at 5:12 AM
bon honnêtement je sais pas... demande plus précisément sur RunUo.com
En plus, tu devrais vraiment attendre que mes scripts soient prêt envant d'envoyer quoi que ce soit, sinon on va avoir de la misère à tout mettre ça compatible, surtout quand il y aura déjà une partie IG.
Et je vais le répéter encore, ce qu'il me manque c'est les chiffres de Crép ET les patente à menu de crafting pour que je les arrange et que j'y ajoute les miens et retire les vieux. Si ce n'était pas de ça, ça ferait longtemps que j'aurais pu demander à faire ajouter des items Ig.
Post by Théodore de Lagarde, AdM - August 30, 2008 at 12:25 AM
http://www.runuo.com/forums/script-support/86963-question-addons.html
Regarde sur ce topic. On dirait que c'est exactement ce que tu essaie de faire. Base toi sur ça pour voir.
Post by Myrddin Emrys, CP - August 30, 2008 at 3:56 AM
j'ai essayer mais mon serveur crash
je sais pas si c'est mon serveur ou le script, j'aurais besoin de l'aide de quelqu'un pouvant tester chez lui
Post by Théodore de Lagarde, AdM - August 30, 2008 at 4:32 AM
J'ai essayé et chez moi ça marche très bien.
Bon, mais j'ai essayé en donnant un hue au deed moi même, mais le lit prend bien la couleur du deed et crash pas
EDIT:Mais sinon, laisse tomber les addons pour tout ça. Parce que ça risque de faire compliquer avec les miens. Il a fallu que je change de place quelques variables et etc...
simplement les meubles normal irait bien.
Post by Myrddin Emrys, CP - August 30, 2008 at 5:30 AM
bha ça serait dommage de pas faire le script au complet, c'est juste quelques trucs a changer...
Post by Théodore de Lagarde, AdM - August 30, 2008 at 5:36 AM
Justement c'est plus que ça et ça va être moi qui va devoir me tapper tout ça, car ça marche pas pareille pour mes addons2.
De toute façons, nombres des addons ne pourront pas être fait, comme les lits(dont ceux le tissus change ce qui a pas rapport avec le bois, donc vaut pas la peine de faire), les cheminées, les fours, les choses en os, les pentagrammes, certaines tables dont seul le tissus change, ce qui est en marbre, etc.