Sujet n°10593
Posté par Nuri Yuri le 4 Nov - 18:09 (2011)
Titre : Téléporter un évent.
Voici un script permettant de copier un évent depuis une autre Map sur la Map en cours avec les positions voulues, il a été fait à partir d'une question sur rpg-maker.fr dans le forum d'entraide.

Script

Code:
#===
#¤class Interpreter
#---
#%Ajout de la methode permettant de charger une évent depuis une autre map
#%Sur la map en cours.
#---
#©03/11/2011 - Nuri Yuri (塗 ゆり)
#©04/11/2011 - Nuri Yuri (塗 ゆり) - Ajout de la possibilité de forcer un id.
#===
class Interpreter
 ID_MAP_DATA=2
 S_Map_File="Data/Map%03d.rxdata"
 Warn=true
 @@old_Map_id=nil
 @Map_Data=nil
 def move_event(id,x,y,map_id=ID_MAP_DATA,force_id=false,sid=0)
  if @@old_Map_id != map_id or !@@Map_Data
   @@old_Map_id=map_id
   @@Map_Data=load_data(sprintf(S_Map_File,map_id))
  end
  event=@@Map_Data.events[id]
  if event
   event.x=x.to_i if x
   event.y=y.to_i if y
   event=Game_Event.new($game_map.map_id, event.clone)
   unless force_id
     if $game_map.events[id]
       arr=$game_map.events.keys.sort
       oid=id
       id=arr[-1]+1
       $game_map.events[id]=event
       p "Attention, l'évent #{oid} existe déjà sur la Map #{$game_map.map_id}, l'évent à été placé avec l'id : #{id}" if Warn
     else
       $game_map.events[id]=event
     end
   else
     id=sid
     $scene.spriteset.delete_character_sprite(id) if $scene.class==Scene_Map
     $game_map.events[id]=event
   end
   event.id=id
   event.event.id=id
   $scene.spriteset.push_character_sprite(id) if $scene.class==Scene_Map
   return true
  else
   p "Erreur : L'évent #{id} n'a pas été trouvé sur la Map #{map_id}" if Warn
   return false
  end
 rescue
  p $! if Warn
  false
 end
end
#===
#¤Class Spriteset_Map
#---
#%Ajout de la methode d'ajout de sprite.
#---
#©03/11/2011 - Nuri Yuri (塗 ゆり)
#===
class Spriteset_Map
 def push_character_sprite(id)
  sprite = Sprite_Character.new(@viewport1, $game_map.events[id])
  @character_sprites.push(sprite)
 end
 def delete_character_sprite(id)
  sprite=nil
  @character_sprites.each {|i|
   if i.character.id==id
    sprite=i
    break
   end
  }
  return unless sprite
  sprite.dispose
  id=@character_sprites.index(sprite)
  @character_sprites[id]=nil
  @character_sprites.compact!
 end
end
#===
#¤Class Game_Character
#---
#%Ajout de l'attribut id
#===
class Game_Character
  attr_accessor :id
  attr_accessor :event
end
#===
#¤Class Scene_Map
#---
#%Ajout de l'attribut spriteset
#===
class Scene_Map
  attr_accessor :spriteset
end


Utilisation

Pour l'utiliser il suffit d'insérer cette commande en appelle de script "move_event(id,x,y)" ça copiera l'évenement id à la position x et y depuis la Map par défauts, vous pouvez mettre un quatrième argument pour copier depuis une autre map que celle par défauts, par exemple : "move_event(5,5,5,32)" pour copier l'évent 5 de la map 32.
Si vous mettez false ou nil à x et y ça va copier l'évent en gardant ses positions de départ.

Pour obliger l'évent à avoir un ID il suffit d'ajouter après l'id de la Map true qui indique que l'on force l'id et l'id de l'évent après true :
Code:
#move_event(id,x,y[,map_id[,force_id,sid]])
move_event(5,10,12,ID_MAP_DATA,true,25) #ID_MAP_DATA étant l'id de la map par défauts...
Attention, dans le cas où vous forcez l'id, l'évent existant ayant déjà cet id sera supprimé donc faites gaffe.

Dans le script il y a deux constantes importantes, ID_MAP_DATA et Warn, ID_MAP_DATA est l'id de la map par défauts et Warn sert à prévenir ou non en cas d'erreurs (évent inexistant / évent ayant déjà l'id) si vous voulez que ça n'affiche pas tout le temps le message d'un évent qui existe déjà mettez false à la place de true et ça n'affichera plus les messages.

Voilà, je pense avoir tout dit.

Posté par Akito アート le 4 Nov - 20:36 (2011)
Merci beaucoup Yuri !

Posté par Kosuke Kyuu le 5 Nov - 05:39 (2011)
C'est excellent ça, merci beaucoup Yuri. ^^

Posté par Nuri Yuri le 5 Nov - 10:56 (2011)
J'ai mis à jour le script, maintenant vous pouvez assigner un id à l'évent copié si vous le voulez, ça peut éviter d'avoir des problèmes avec les évents déjà existant sur la map.

Posté par Suicune31 le 5 Nov - 11:59 (2011)
Petit soucis pour moi ^^.
Ce script copie que l'apparence des évents et non les commande qui on été ajouter sur lui, je me trompe ?
Car javais trouver l'utilité de ce script en transférant un évent avec des commandes qui se lancerais à l'apparition de cet évent sur la map or, là, rien e se passe ^^.
C'est dommage :s.

tu pense pouvoir réglé ça ?

EDIT : Sinon si on pouvais supprimer tes évent par appel de script ça réglerais mon problème ^^,
           mais je préfère la première solution Imbécile heureux;

Posté par Nuri Yuri le 5 Nov - 12:34 (2011)
Normalement ça doit copier les commandes, j'ai corrigé le bug de la suppression de l'évent quand il a un id différent. J'ai testé en PP et en DA et ça fonctionne...
Je met à jour le script dans le premier post, merci de m'avoir raporté les bugs, si ça marche toujours pas il faut que tu me montre les trucs en détails.

Posté par Suicune31 le 5 Nov - 12:46 (2011)
ça fonctionne Yuri, merci beaucoup Imbécile heureux

Posté par Kosuke Kyuu le 5 Nov - 15:34 (2011)
Oh très bien pour l'id de l'évènement choisis, c'est très utile, Merci.^^