Sujet: Script de détection [Résolu, ça gère] Mer 5 Mai 2010 - 17:41
Plop,
Je viens poster ici parce que je ne trouve plus un certain script, et qu'à cause de ça je me demande si ce n'est pas simplement mon imagination qui a créé ce script.
Me semble pourtant avoir vu, jadis, un script permettant de détecter la position du héros par rapport à un autre évènement. Les éléments du décor permettaient de cacher le héros aux "yeux" de cet évènement, et si le éros était dans le champ de vision du héros, baah.. Je sais plus ce qui se passait.
En tout cas, si vous retrouvez ce script, merci de me l'indiquer. J'ai cherché dans les Scripts -> Autres et Script -> Map et Script -> Héros mais.. Pas trouvé. J'espère qu'il est pas dedans, sinon pendez-moi sur un chameau à 6 bosses.
TaZ
Dernière édition par TaZ le Mer 5 Mai 2010 - 18:08, édité 1 fois
Sylfurion
Mage Lv.11
Age : 27 Inscrit le : 02/03/2009 Messages : 513
Sujet: Re: Script de détection [Résolu, ça gère] Mer 5 Mai 2010 - 17:45
Alors il y a le SDS
Spoiler:
Code:
#------------------------------------------------------------------------------- # # Stealth Detection System v 1.0 # code by cmpsr2000 @ rpgrevolution.com/forums # Released June 11, 2008 # #------------------------------------------------------------------------------- #------------------------------------------------------------------------------- # # SDS is an advanced stealth detection system for use in RPG Maker VX games. # To use the system, you need to build an event that begins with a script call: # # $game_stealth.detector(eventID, detectRange, detectAction, # tunnelVision, trueSight) # # eventID: The ID of the event. Use @event_id as it's the easiest way # detectRange: How far the "guard" is able to see. Higher numbers require # more CPU time to proccess! Lag increases exponentially if # you are NOT using tunnel vision. # detectAction: The action to perform when the guard detects the player # DEFAULT = 1 # 0: Goto jail event # 1: Game Over # 2: Execute common event # 3: MGS Mode # tunnelVision: determines whether the guard's field of view cones out or # goes in a straight line. # DEFAULT = false # trueSight: determines whether the guard can see through obstacles # DEFAULT = false # # NOTE: You do NOT have to set parameters that have a default. # # MGS MODE EXPLAINATION: # # When using detectAction 3 (MGS Mode) guards will be "alerted" if # they spot the player. The guard will run to the position they spotted # the player at, then begin to look around for the player again. If the # guard sees the player a second time, the captureAction is performed. # #------------------------------------------------------------------------------- class Game_Stealth
#--------------------------------------------------------------------------- # If you use tunnel vision, set the tunnel width here. It MUST be an ODD # number or the game will round up to the next odd number! Widths over 3 # are not recomended. #--------------------------------------------------------------------------- @tunnelWidth = 3
#--------------------------------------------------------------------------- # The common event ID to execute when using the common event detect action #--------------------------------------------------------------------------- @common_event_id = 199
#--------------------------------------------------------------------------- # The game_variable ID that will store the event ID when the common event is launched. This # can be used to allow the common event to interact with the event during its execution. #--------------------------------------------------------------------------- @event_id_variable = 150
#--------------------------------------------------------------------------- # The speed and frequency the guards move when they detect the player in # MGS mode. # speed: 1: x8 slower, # 2: x4 slower # 3: x2 slower # 4: normal # 5: x2 faster # 6: x4 faster # # frequency: 1: lowest # 2: lower # 3: normal # 4: higher # 5: highest #--------------------------------------------------------------------------- @guardInterceptSpeed = 4 @guardInterceptFrequency = 5
#--------------------------------------------------------------------------- # When in MGS mode, the action to be performed if the guard detects the # player a second time. This is set by default to game_over since all other # options require some configuration. Valid values are: # captureAction: 0: Goto jail event # 1: Game Over # 2: Execute common event #--------------------------------------------------------------------------- @captureAction = 2
#--------------------------------------------------------------------------- # How many frames a guard will wait before executing each turn when # searching for the player after detecting them in MGS mode. #--------------------------------------------------------------------------- @waitTime = 60
#--------------------------------------------------------------------------- # Change this to false to disable the detection radius around guards. # This means the player can safely stand next to a guard as long as he's # not in the guard's line of sight. #--------------------------------------------------------------------------- @allowDetectRadius= false
@tunnelWidth += 1 if (@tunnelWidth % 2) == 0 end
#----------------------------------------------------------------------------- # Standard update method; checks for player detection then handles MGS # state changes for guards then checks for player detection again #----------------------------------------------------------------------------- def update if $game_player.detected and not $game_player.moving? doDetectAction end for guard in @alertedGuards case guard.detectState when nil, 0 #alerted guard.lock guard.returnX = guard.x guard.returnY = guard.y guard.returnRoute = guard.move_route guard.returnRouteIndex = guard.move_route_index guard.returnSpeed = guard.move_speed guard.returnFrequency = guard.move_frequency guard.move_speed = @guardInterceptSpeed guard.move_frequency = @guardInterceptFrequency guard.isAware = false guard.detectState = guard.goto($game_player.x, $game_player.y) ? 1 : 3 guard.unlock when 1 #intercepting if (guard.move_route_index == guard.move_route.list.length - 1 and guard.stopping?) or guard.move_failed guard.lock guard.isAware = true guard.spinInPlace(@waitTime) guard.detectState = 2 guard.unlock end when 2 #checking if guard.move_route_index == guard.move_route.list.length - 1 and guard.stopping? guard.lock guard.isAware = false go = guard.goto(guard.returnX, guard.returnY) guard.detectState = 3 guard.unlock end when 3 #returning if guard.move_route_index == guard.move_route.list.length - 1 and not guard.moving? guard.lock guard.isAware = true guard.move_route = guard.returnRoute guard.move_route_index = guard.returnRouteIndex guard.move_speed = guard.returnSpeed guard.move_frequency = guard.returnFrequency guard.detectState = 0 @captured = false @alertedGuards.delete(guard) guard.unlock end end end observe end #----------------------------------------------------------------------------- # Runs through the aware events(guards) on the map and tells them to check # for the player. #----------------------------------------------------------------------------- def observe
if ($game_player.moved?) isCheckAllEvents = true else isCheckAllEvents = false end
for event in $game_map.events.values #events is a hash! if event.isAware if isCheckAllEvents or event.moved? or event.turned?
if checkForDetection(event) $game_player.detected = true @detectingEvent = event return end end end @checkedTiles = [] @fovPassability = {}
end end #----------------------------------------------------------------------------- # Runs through each tile in the event(guard)'s field of view and checks # it for the player. RETURNS: Boolean # event: The guard that is currently checking for the player. #----------------------------------------------------------------------------- def checkForDetection(event) return true if playerInDetectionRadius(event) return false if playerOutOfRange(event)
fieldOfView = event.tunnelVision ? @tunnelWidth : 1 for distance in 1..event.detectRange for width in 1..fieldOfView return true if checkTile(event, width, distance) end fieldOfView += 2 unless event.tunnelVision end return false end #----------------------------------------------------------------------------- # Checks a tile for the player. RETURNS: Boolean # event: The guard that is currently checking for the player. # width: The width-index of the tile being checked # distance: The depth-index of the tile being checked #----------------------------------------------------------------------------- def checkTile(event, width, distance) if event.tunnelVision if @tunnelWidth > 1 width = ((@tunnelWidth + 1) / 2) - (@tunnelWidth + 1) + width else width = 0 end else width -= distance end x = event.x y = event.y direction = event.direction case direction when 2 #DOWN y += distance x += width when 4 #LEFT y += width x -= distance when 6 #RIGHT y += width x += distance when 8 #UP y -= distance x += width end return false if @checkedTiles.index([x,y]) != nil
return false if tileHidden?(event, x, y) return true if $game_player.x == x and $game_player.y == y return false end #----------------------------------------------------------------------------- # Determines the visibility of a tile to a guard. RETURNS: Boolean # event: The guard that is currently checking for the player. # x: The x coordinate of the tile to be checked # y: The y coordinate of the tile to be checked #----------------------------------------------------------------------------- def tileHidden?(event, x, y) return false if event.trueSight #check the current tile first @checkedTiles.push([x,y]) originalX = x originalY = y if not $game_map.passable?(x, y) @fovPassability[[x,y]] = false return true end
#now check all adjacent tiles one step closer to the detector direction = event.direction case direction when 2 #down y -= 1 for i in (x-1)..(x+1) #if we've checked the tile, then it exists in the FoV if @checkedTiles.index([i,y]) != nil if not @fovPassability[[i,y]] @fovPassability[[originalX,originalY]] = false return true end end end when 4 #left x += 1 for i in (y-1)..(y+1) #if we've checked the tile, then it exists in the FoV if @checkedTiles.index([x,i]) != nil if not @fovPassability[[x,i]] @fovPassability[[originalX,originalY]] = false return true end end end when 6 #right x -= 1 for i in (y-1)..(y+1) #if we've checked the tile, then it exists in the FoV if @checkedTiles.index([x,i]) != nil if not @fovPassability[[x,i]] @fovPassability[[originalX,originalY]] = false return true end end end when 8 #up y += 1 for i in (x-1)..(x+1) #if we've checked the tile, then it exists in the FoV if @checkedTiles.index([i,y]) != nil if not @fovPassability[[i,y]] @fovPassability[[originalX,originalY]] = false return true end end end end
#this tile and the blocking tiles must be passable @fovPassability[[originalX,originalY]] = true return false end
#----------------------------------------------------------------------------- # Guards and other "detector" events have an awareness of their immediate # surroundings. If the player is adjacent to the event, they will be # discovered if @allowDetectRadius is true. RETURNS: Boolean # event: The guard that is currently checking for the player. #----------------------------------------------------------------------------- def playerInDetectionRadius(event) return false unless @allowDetectRadius adjacentTiles = [ [event.x, event.y - 1], [event.x + 1, event.y - 1], [event.x + 1, event.y], [event.x + 1, event.y + 1], [event.x, event.y + 1], [event.x - 1, event.y + 1], [event.x - 1, event.y], [event.x - 1, event.y - 1] ] for tile in adjacentTiles if $game_player.x == tile[0] and $game_player.y == tile[1] return true end end return false end
def playerOutOfRange(event) direction = event.direction case direction when 2 #down yDifference = event.y - $game_player.y xDifference = event.x - $game_player.x coneWidth = event.tunnelVision ? (@tunnelWidth / 2).floor : event.detectRange - 1 if yDifference > event.detectRange or $game_player.y < event.y - 1 or (xDifference.abs > coneWidth) return true end when 4 #left yDifference = event.y - $game_player.y xDifference = event.x - $game_player.x coneWidth = event.tunnelVision ? (@tunnelWidth / 2).floor : event.detectRange - 1 if xDifference > event.detectRange or $game_player.x > event.x + 1 or (yDifference.abs > coneWidth) return true end when 6 #right yDifference = $game_player.y - event.y xDifference = $game_player.x - event.x coneWidth = event.tunnelVision ? (@tunnelWidth / 2).floor : event.detectRange - 1 if xDifference > event.detectRange or $game_player.x < event.x - 1 or (yDifference.abs > coneWidth) return true end when 8 #up yDifference = event.y - $game_player.y xDifference = event.x - $game_player.x coneWidth = event.tunnelVision ? (@tunnelWidth / 2).floor : event.detectRange - 1 if yDifference > event.detectRange or $game_player.y > event.y + 1 or (xDifference.abs > coneWidth) return true end end return false end #----------------------------------------------------------------------------- # Called in an event to enable detection for the event (guard). # eventID: The id of the event. use @event_id in your event call! # detectRange: How far away the guard can see # detectAction: What happens when caught. defaults to game_over # tunnelVision: Whether the guard has field of view or tunnel vision # trueSight: Whether the guard can see through objects #----------------------------------------------------------------------------- def detector(eventID, detectRange, detectAction = 1, tunnelVision = false, trueSight = false) event = $game_map.events[eventID] event.isAware = true event.detectAction = detectAction event.detectRange = detectRange event.tunnelVision = tunnelVision event.trueSight = trueSight event.setPosition end #----------------------------------------------------------------------------- # Called in an event to set the location tile of the "jail" # eventID: The ID of the event that is at the jail location. # Again, use @event_id #----------------------------------------------------------------------------- def jail(eventID) event = $game_map.events[eventID] @jailX = event.x @jailY = event.y end #----------------------------------------------------------------------------- # Executes the desired action upon detecting the player #----------------------------------------------------------------------------- def doDetectAction case @detectingEvent.detectAction when 0 # goto jail sendToJail when 1 # game over $scene = Scene_Gameover.new when 2 # execute common event doCommonEvent when 3 # MGS - enemy moves towards player position if @detectingEvent.detectState == 2 if not @captured case @captureAction when 0 sendToJail when 1, 3 gameOver when 2 doCommonEvent end @captured = true end else Sound.play_found @detectingEvent.balloon_id = 1 unless @alertedGuards.include?(@detectingEvent) @alertedGuards.push(@detectingEvent) end end end $game_player.detected = false @detectingEvent = nil end #----------------------------------------------------------------------------- # MODE 0: Send player to the "jail" tile #----------------------------------------------------------------------------- def sendToJail $game_player.reserve_transfer($game_map.map_id, @jailX, @jailY, @detectingEvent.direction) end #----------------------------------------------------------------------------- # MODE 1: Game Over #----------------------------------------------------------------------------- def gameOver $scene = Scene_Gameover.new end #----------------------------------------------------------------------------- # MODE 2: Execute Common Event #----------------------------------------------------------------------------- def doCommonEvent if @event_id_variable > 0 $game_variables [@event_id_variable] = @detectingEvent.id end $game_temp.common_event_id = @common_event_id end end
tu doit mettre le script redefinitions au dessus :
Spoiler:
Code:
#------------------------------------------------------------------------------- # This is a surprise ^^ #------------------------------------------------------------------------------- module Sound def self.play_found Audio.se_play("Audio/SE/found.wav", 100, 100) end end #------------------------------------------------------------------------------- # This contains command for object movement and can be reused and included in # any game_character or it's descendants. #------------------------------------------------------------------------------- module Movement #----------------------------------------------------------------------------- # Checks to see whether this object has moved since the last check. # RETURNS: Boolean #----------------------------------------------------------------------------- def moved? if self.x != @oldX or self.y != @oldY setPosition return true else return false end end #----------------------------------------------------------------------------- # Checks to see whether this object has turned. # RETURNS: Boolean #----------------------------------------------------------------------------- def turned? if self.direction != @oldDirection setDirection return true else return false end end #----------------------------------------------------------------------------- # Saves the current direction so that it can be checked against after a turn #----------------------------------------------------------------------------- def setDirection @oldDirection = self.direction end #----------------------------------------------------------------------------- # Saves the current position so that it can be checked against after a move #----------------------------------------------------------------------------- def setPosition @oldX = self.x @oldY = self.y end #----------------------------------------------------------------------------- # Changes the object's route to perform an in-place spin while waiting after # each turn. It is recommended to call object.lock before using this, and # call object.unlock when it has complete. #----------------------------------------------------------------------------- def spinInPlace(waitTime) spinRoute = RPG::MoveRoute.new spinRoute.repeat = false spinRoute.wait = true for x in 0..3 spinRoute.list.push(RPG::MoveCommand.new(15, [waitTime])) spinRoute.list.push(RPG::MoveCommand.new(16 + x)) end spinRoute.list.push(RPG::MoveCommand.new(15, [waitTime])) spinRoute.list.push(RPG::MoveCommand.new(0)) spinRoute.list.delete_at(0) #weird RGSS Anomoly, must delete empty position
self.move_route = spinRoute self.move_route_index = 0 end #----------------------------------------------------------------------------- # This is an advanced pathfinding algorithm that returns a boolean indicating # whether or not it was able to find a path from the start point (the object's # current location) to the endpoint, then changes the object's move values # to initiate movement. RETURNS: Boolean # finalX: x coordinate of the destination # finalY: y coordinate of the destination #----------------------------------------------------------------------------- def goto(finalX, finalY) return true if self.x == finalX and self.y == finalY startX = self.x startY = self.y
#main logic while @closedList.index(finalNode) == nil nodeToCheck = @activeList[0] #lowest F is always in position 0! if nodeToCheck == nil noPath = true break end moveToClosed(nodeToCheck) for node in adjacentNodes(nodeToCheck) #a "node" is an array: [x, y] !!! if ($game_map.passable?(node[0], node[1]) and @closedList.index(node) == nil) or node == finalNode index = @activeList.index(node) if index == nil scores = calcScores(node, nodeToCheck, finalNode) insertionPoint = findInsertionPoint(scores[0]) @activeList.insert(insertionPoint, node) @activeParents.insert(insertionPoint, nodeToCheck) @activeScores.insert(insertionPoint, scores) else g = calcG(nodeToCheck) if g < @activeScores[index][1] @activeParents[index] = nodeToCheck h = @activeScores[index][2] f = g + h @activeScores[index] = [f, g, h] insertionPoint = findInsertionPoint(@activeScores[index][0])
#we don't need to reinsert if we already exist in the right place if insertionPoint != index tempNode = @activeList[index] tempParent = @activeParents[index] tempScores = @activeScores[index]
#reinsert @activeList.insert(insertionPoint, tempNode) @activeParents.insert(insertionPoint, tempParent) @activeScores.insert(insertionPoint, tempScores) end end end end end end
#return if there is no path, otherwise build the path return false if noPath path = [finalNode] parent = @closedParents[@closedList.index(finalNode)] while parent != [startX, startY] path.push(parent) parent = @closedParents[@closedList.index(parent)] end path.reverse! #put the path in order of execution
#make a new route object that doesn't repeat (one time use only!) gotoRoute = RPG::MoveRoute.new gotoRoute.repeat = false
#itterate through the path and add the appropriate commands to the route #we can't move diagonal, so only one x or one y should change between steps lastNode = [startX, startY] for node in path if node[0] > lastNode[0] commandCode = 3 # move right elsif node[0] < lastNode[0] commandCode = 2 # move left else if node[1] > lastNode[1] commandCode = 1 # move down elsif node[1] < lastNode[1] commandCode = 4 # move up end end lastNode = node gotoRoute.list.push(RPG::MoveCommand.new(commandCode)) end gotoRoute.list.push(RPG::MoveCommand.new(0)) gotoRoute.list.delete_at(0) #weird RGSS Anomoly, must delete empty position
#set the object's route and return! self.move_route = gotoRoute self.move_route_index = 0 return true end #----------------------------------------------------------------------------- # moves the active node to the closed list so it's not checked twice! #----------------------------------------------------------------------------- def moveToClosed(activeNode) index = @activeList.index(activeNode)
#add to closed @closedList.push(@activeList[index]) @closedParents.push(@activeParents[index]) @closedScores.push(@activeScores[index])
#delete from active @activeList.delete_at(index) @activeParents.delete_at(index) @activeScores.delete_at(index) end #----------------------------------------------------------------------------- # finds the array insertion point based on the f score #----------------------------------------------------------------------------- def findInsertionPoint(f) insertionPoint = 0 if @activeList.length != 0 while insertionPoint < @activeList.length if f <= @activeScores[insertionPoint][0] break else insertionPoint += 1 end end end
return insertionPoint end #----------------------------------------------------------------------------- # calculates all the scores for a node #----------------------------------------------------------------------------- def calcScores(node, parentNode, finalNode) h = calcH(node, finalNode) g = calcG(parentNode) f = g + h
return [f, g, h] end #----------------------------------------------------------------------------- # calculates the G value (route distance) #----------------------------------------------------------------------------- def calcG(parentNode) #can't move diagonly: just add 1 to parent score index = @closedList.index(parentNode) score = @closedScores[index][1] + 1 return score end #----------------------------------------------------------------------------- # claculates the H value (distance from start to finish) #----------------------------------------------------------------------------- def calcH(node, finalNode) #Manhattan method is admissible in this context score = (node[0] - finalNode[0]).abs + (node[1] - finalNode[1]).abs
return score end #----------------------------------------------------------------------------- # Finds the adjacent nodes of the active node #----------------------------------------------------------------------------- def adjacentNodes(sourceNode) node1 = [sourceNode[0] + 1, sourceNode[1]] node2 = [sourceNode[0], sourceNode[1] + 1] node3 = [sourceNode[0] - 1, sourceNode[1]] node4 = [sourceNode[0], sourceNode[1] - 1] return [node1, node2, node3, node4] end end #------------------------------------------------------------------------------- # the instance of $game_stealth needs to be created #------------------------------------------------------------------------------- class Scene_Title < Scene_Base alias oldCreateGameObjectsStealth create_game_objects def create_game_objects oldCreateGameObjectsStealth $game_stealth = Game_Stealth.new end end #------------------------------------------------------------------------------- # The stealth system needs to be updated every frame along with the map scene #------------------------------------------------------------------------------- class Scene_Map < Scene_Base alias oldUpdateStealth update def update oldUpdateStealth unless $game_message.visible # Unless displaying a message $game_stealth.update end end end
class Game_Player < Game_Character include Movement attr_accessor :detected end #------------------------------------------------------------------------------- # Events have tons of new attributes with the stealth system. Plus, we need to # include the movement module and initialize awareness to false. #------------------------------------------------------------------------------- class Game_Event < Game_Character include Movement
alias oldInitStealth initialize def initialize(map_id, event) oldInitStealth(map_id, event) @isAware = false end end
Dernière édition par Sylfurion le Mer 5 Mai 2010 - 17:46, édité 1 fois
TaZ
Age : 30 Inscrit le : 22/11/2008 Messages : 3382
Sujet: Re: Script de détection [Résolu, ça gère] Mer 5 Mai 2010 - 17:48
Yeaah, tu roxx, merci du script. Simple question, existe-t-il un topic qui explique les fonctions du script ? Sinon je me débrouillerai sans.
Sylfurion
Mage Lv.11
Age : 27 Inscrit le : 02/03/2009 Messages : 513
Sujet: Re: Script de détection [Résolu, ça gère] Mer 5 Mai 2010 - 17:50
Euh bah ... 2min, je me souviens d'avoir vue un topic sur ce forum, mais je n'arrive pas a le retrouver, mais sinon c'est simple tkt ^^. Si tu comprends a peu près l'anglais, sinon j'essaierai de t'aider ^^
TaZ
Age : 30 Inscrit le : 22/11/2008 Messages : 3382
Sujet: Re: Script de détection [Résolu, ça gère] Mer 5 Mai 2010 - 17:54
Il y a juste quelque chose que je ne comprends pas, à vrai dire:
Code:
# detectAction: The action to perform when the guard detects the player # DEFAULT = 1 # 0: Goto jail event # 1: Game Over # 2: Execute common event # 3: MGS Mode
Le 0, c'est quoi, exactement ? Le 2 exécute un évènement "commun", c'est ça? Comment définir l'ID de l'évènement commun à activer ? Ou alors il s'agit d'exécuter un évènement manuel ..? Le 3, pas pigé ^^
Code:
# more CPU time to proccess! Lag increases exponentially if
J'avoue ne pas vraiment avoir compris ça non plus.
Sylfurion
Mage Lv.11
Age : 27 Inscrit le : 02/03/2009 Messages : 513
Sujet: Re: Script de détection [Résolu, ça gère] Mer 5 Mai 2010 - 18:03
Alors le 0 je crois que ça active l'evenement qui t'as pris en flagrant délit. le 2 oui c'est bien l'event commun pour le configurer tu vas ici :
Code:
#--------------------------------------------------------------------------- # The common event ID to execute when using the common event detect action #--------------------------------------------------------------------------- @common_event_id = 199
tu modifie 199 par l'event commun que tu vas utiliser lorsque le joueur se fait prendre. ce bout de script est vers le début ^^
alors le MGS mode c'est assez compliqué, en fait c'est pour laisser une 2eme chance au joueur, si le joueur se fait prendre le pnj fonce vert le héros une fois et après il s'en vas, si le héros se fait prendre une deuxième fois, je crois que ça execute ce que tu veux :
Code:
#--------------------------------------------------------------------------- # When in MGS mode, the action to be performed if the guard detects the # player a second time. This is set by default to game_over since all other # options require some configuration. Valid values are: # captureAction: 0: Goto jail event # 1: Game Over # 2: Execute common event #--------------------------------------------------------------------------- @captureAction = 2
tu modifie cette partie de script, il est un peu en dessous de la configuration de l'event commun. tu remplaces 2 par ce que tu veux que l'event fasse. Si tu met 0 sa fait l'evenement du pnj qui t'as trouver. Si tu fait 1 sa met une game over et si tu mets 2 sa execute l'event commun.
Si je me suis trompé corriger moi amis scripteurs ^^
TaZ
Age : 30 Inscrit le : 22/11/2008 Messages : 3382
Sujet: Re: Script de détection [Résolu, ça gère] Mer 5 Mai 2010 - 18:04
Tu es vraiment génial, mec ! Merci beaucoup pour ton aide.
Sylfurion
Mage Lv.11
Age : 27 Inscrit le : 02/03/2009 Messages : 513
Sujet: Re: Script de détection [Résolu, ça gère] Mer 5 Mai 2010 - 18:05
Derien, n'oublie pas de mettre [RESOLU] dans ton titre du sujet.