@ -17,6 +17,8 @@ import engine.objects.PlayerCharacter;
				@@ -17,6 +17,8 @@ import engine.objects.PlayerCharacter;
					 
			
		
	
		
			
				
					import  engine.server.MBServerStatics ;  
			
		
	
		
			
				
					import  org.pmw.tinylog.Logger ;  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					import  java.sql.Connection ;  
			
		
	
		
			
				
					import  java.sql.PreparedStatement ;  
			
		
	
		
			
				
					import  java.sql.ResultSet ;  
			
		
	
		
			
				
					import  java.sql.SQLException ;  
			
		
	
		
			
				
					import  java.util.concurrent.ConcurrentHashMap ;  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -29,88 +31,146 @@ public class dbCharacterSkillHandler extends dbHandlerBase {
				@@ -29,88 +31,146 @@ public class dbCharacterSkillHandler extends dbHandlerBase {
					 
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  CharacterSkill  ADD_SKILL ( CharacterSkill  toAdd )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							CharacterSkill  characterSkill  =  null ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( CharacterSkill . GetOwner ( toAdd )  = =  null  | |  toAdd . getSkillsBase ( )  = =  null )  {   
			
		
	
		
			
				
								Logger . error ( "dbCharacterSkillHandler.ADD_SKILL" ,  toAdd . getObjectUUID ( )  +  " missing owner or skillsBase" ) ;   
			
		
	
		
			
				
								return  null ;   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							prepareCallable ( "INSERT INTO `dyn_character_skill` (`CharacterID`, `skillsBaseID`, `trains`) VALUES (?, ?, ?);" ) ;   
			
		
	
		
			
				
							setLong ( 1 ,  ( long ) CharacterSkill . GetOwner ( toAdd ) . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
							setInt ( 2 ,  toAdd . getSkillsBase ( ) . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
							setInt ( 3 ,  toAdd . getNumTrains ( ) ) ;   
			
		
	
		
			
				
							int  skillID  =  insertGetUUID ( ) ;   
			
		
	
		
			
				
							return  GET_SKILL ( skillID ) ;   
			
		
	
		
			
				
							try  ( Connection  connection  =  DbManager . getConnection ( ) ;   
			
		
	
		
			
				
								 PreparedStatement  preparedStatement  =  connection . prepareStatement ( "INSERT INTO `dyn_character_skill` (`CharacterID`, `skillsBaseID`, `trains`) VALUES (?, ?, ?);" ) )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								preparedStatement . setLong ( 1 ,  CharacterSkill . GetOwner ( toAdd ) . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
								preparedStatement . setInt ( 2 ,  toAdd . getSkillsBase ( ) . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
								preparedStatement . setInt ( 3 ,  toAdd . getNumTrains ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								preparedStatement . executeUpdate ( ) ;   
			
		
	
		
			
				
								ResultSet  rs  =  preparedStatement . getGeneratedKeys ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								if  ( rs . next ( ) )   
			
		
	
		
			
				
									characterSkill  =  GET_SKILL ( rs . getInt ( 1 ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							}  catch  ( SQLException  e )  {   
			
		
	
		
			
				
								Logger . error ( e ) ;   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
							return  characterSkill ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  boolean  DELETE_SKILL ( final  int  objectUUID )  {   
			
		
	
		
			
				
							prepareCallable ( "DELETE FROM `dyn_character_skill` WHERE `UID` = ?" ) ;   
			
		
	
		
			
				
							setLong ( 1 ,  ( long ) objectUUID ) ;   
			
		
	
		
			
				
							return  ( executeUpdate ( )  ! =  0 ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							try  ( Connection  connection  =  DbManager . getConnection ( ) ;   
			
		
	
		
			
				
								 PreparedStatement  preparedStatement  =  connection . prepareStatement ( "DELETE FROM `dyn_character_skill` WHERE `UID` = ?" ) )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								preparedStatement . setLong ( 1 ,  objectUUID ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								return  ( preparedStatement . executeUpdate ( )  >  0 ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							}  catch  ( SQLException  e )  {   
			
		
	
		
			
				
								Logger . error ( e ) ;   
			
		
	
		
			
				
								return  false ;   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  CharacterSkill  GET_SKILL ( final  int  objectUUID )  {   
			
		
	
		
			
				
							CharacterSkill  skill  =  ( CharacterSkill )  DbManager . getFromCache ( Enum . GameObjectType . CharacterSkill ,  objectUUID ) ;   
			
		
	
		
			
				
							if  ( skill  ! =  null )   
			
		
	
		
			
				
								return  skill ;   
			
		
	
		
			
				
							prepareCallable ( "SELECT * FROM `dyn_character_skill` WHERE `UID` = ?" ) ;   
			
		
	
		
			
				
							setInt ( 1 ,  objectUUID ) ;   
			
		
	
		
			
				
							return  ( CharacterSkill )  getObjectSingle ( objectUUID ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							CharacterSkill  characterSkill  =  ( CharacterSkill )  DbManager . getFromCache ( Enum . GameObjectType . CharacterSkill ,  objectUUID ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( characterSkill  ! =  null )   
			
		
	
		
			
				
								return  characterSkill ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							try  ( Connection  connection  =  DbManager . getConnection ( ) ;   
			
		
	
		
			
				
								 PreparedStatement  preparedStatement  =  connection . prepareStatement ( "SELECT * FROM `dyn_character_skill` WHERE `UID` = ?" ) )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								preparedStatement . setInt ( 1 ,  objectUUID ) ;   
			
		
	
		
			
				
								ResultSet  rs  =  preparedStatement . executeQuery ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								characterSkill  =  ( CharacterSkill )  getObjectFromRs ( rs ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							}  catch  ( SQLException  e )  {   
			
		
	
		
			
				
								Logger . error ( e ) ;   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
							return  characterSkill ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  ConcurrentHashMap < String ,  CharacterSkill >  GET_SKILLS_FOR_CHARACTER ( final  AbstractCharacter  ac )  {   
			
		
	
		
			
				
							ConcurrentHashMap < String ,  CharacterSkill >  skills  =  new  ConcurrentHashMap < > ( MBServerStatics . CHM_INIT_CAP ,  MBServerStatics . CHM_LOAD ,  MBServerStatics . CHM_THREAD_LOW ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							ConcurrentHashMap < String ,  CharacterSkill >  characterSkills  =  new  ConcurrentHashMap < > ( MBServerStatics . CHM_INIT_CAP ,  MBServerStatics . CHM_LOAD ,  MBServerStatics . CHM_THREAD_LOW ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( ac  = =  null  | |  ( ! ( ac . getObjectType ( ) . equals ( Enum . GameObjectType . PlayerCharacter ) ) ) )   
			
		
	
		
			
				
								return  skills ;   
			
		
	
		
			
				
							PlayerCharacter  pc  =  ( PlayerCharacter )  ac ;   
			
		
	
		
			
				
							int  objectUUID  =  pc . getObjectUUID ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							prepareCallable ( "SELECT * FROM `dyn_character_skill` WHERE `CharacterID` = ?" ) ;   
			
		
	
		
			
				
							setInt ( 1 ,  objectUUID ) ;   
			
		
	
		
			
				
							try  {   
			
		
	
		
			
				
								ResultSet  rs  =  executeQuery ( ) ;   
			
		
	
		
			
				
								return  characterSkills ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							PlayerCharacter  playerCharacter  =  ( PlayerCharacter )  ac ;   
			
		
	
		
			
				
							int  characterId  =  playerCharacter . getObjectUUID ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							try  ( Connection  connection  =  DbManager . getConnection ( ) ;   
			
		
	
		
			
				
								 PreparedStatement  preparedStatement  =  connection . prepareStatement ( "SELECT * FROM `dyn_character_skill` WHERE `CharacterID` = ?" ) )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								preparedStatement . setInt ( 1 ,  characterId ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								ResultSet  rs  =  preparedStatement . executeQuery ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								while  ( rs . next ( ) )  {   
			
		
	
		
			
				
									CharacterSkill  cs  =  new  CharacterSkill ( rs ,  pc ) ;   
			
		
	
		
			
				
									CharacterSkill  cs  =  new  CharacterSkill ( rs ,  playerChara cter  ) ;   
			
		
	
		
			
				
									if  ( cs . getSkillsBase ( )  ! =  null )   
			
		
	
		
			
				
										skills . put ( cs . getSkillsBase ( ) . getName ( ) ,  cs ) ;   
			
		
	
		
			
				
										characterS kills. put ( cs . getSkillsBase ( ) . getName ( ) ,  cs ) ;   
			
		
	
		
			
				
								}   
			
		
	
		
			
				
								rs . close ( ) ;   
			
		
	
		
			
				
					
  
			
		
	
		
			
				
							}  catch  ( SQLException  e )  {   
			
		
	
		
			
				
								Logger . error ( "CharacterSkill.getCharacterSkillForCharacter" ,  e ) ;   
			
		
	
		
			
				
							}  finally  {   
			
		
	
		
			
				
								closeCallable ( ) ;   
			
		
	
		
			
				
								Logger . error ( e ) ;   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
							return  skills ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							return  characterSkills ;   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  void  UPDATE_TRAINS ( final  CharacterSkill  cs )  {   
			
		
	
		
			
				
							if  ( ! cs . isTrained ( ) )   
			
		
	
		
			
				
						public  void  UPDATE_TRAINS ( final  CharacterSkill  characterSkill )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( ! characterSkill . isTrained ( ) )   
			
		
	
		
			
				
								return ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							prepareCallable ( "UPDATE `dyn_character_skill` SET `trains`=? WHERE `UID` = ?" ) ;   
			
		
	
		
			
				
							setShort ( 1 ,  ( short ) cs . getNumTrains ( ) ) ;   
			
		
	
		
			
				
							setLong ( 2 ,  ( long ) cs . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
							if  ( executeUpdate ( )  ! =  0 )   
			
		
	
		
			
				
								cs . syncTrains ( ) ;   
			
		
	
		
			
				
							try  ( Connection  connection  =  DbManager . getConnection ( ) ;   
			
		
	
		
			
				
								 PreparedStatement  preparedStatement  =  connection . prepareStatement ( "UPDATE `dyn_character_skill` SET `trains`=? WHERE `UID` = ?" ) )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								preparedStatement . setShort ( 1 ,  ( short )  characterSkill . getNumTrains ( ) ) ;   
			
		
	
		
			
				
								preparedStatement . setLong ( 2 ,  ( long )  characterSkill . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								if  ( preparedStatement . executeUpdate ( )  ! =  0 )   
			
		
	
		
			
				
									characterSkill . syncTrains ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							}  catch  ( SQLException  e )  {   
			
		
	
		
			
				
								Logger . error ( e ) ;   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						public  void  updateDatabase ( final  CharacterSkill  cs )  {   
			
		
	
		
			
				
							if  ( cs . getSkillsBase ( )  = =  null )  {   
			
		
	
		
			
				
								Logger . error ( "Failed to find skillsBase for Skill "  +  cs . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
						public  void  updateDatabase ( final  CharacterSkill  characterSkill )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( characterSkill . getSkillsBase ( )  = =  null )  {   
			
		
	
		
			
				
								Logger . error ( "Failed to find skillsBase for Skill "  +  characterSkill . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
								return ;   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
							if  ( CharacterSkill . GetOwner ( cs )  = =  null )  {   
			
		
	
		
			
				
								Logger . error ( "Failed to find owner for Skill "  +  cs . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							if  ( CharacterSkill . GetOwner ( characterSkill )  = =  null )  {   
			
		
	
		
			
				
								Logger . error ( "Failed to find owner for Skill "  +  characterSkill . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
								return ;   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							prepareCallable ( "UPDATE `dyn_character_skill` SET `skillsBaseID`=?, `CharacterID`=?, `trains`=? WHERE `UID`=?" ) ;   
			
		
	
		
			
				
							setInt ( 1 ,  cs . getSkillsBase ( ) . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
							setInt ( 2 ,  CharacterSkill . GetOwner ( cs ) . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
							setShort ( 3 ,  ( short ) cs . getNumTrains ( ) ) ;   
			
		
	
		
			
				
							setLong ( 4 ,  ( long ) cs . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
							if  ( executeUpdate ( )  ! =  0 )   
			
		
	
		
			
				
								cs . syncTrains ( ) ;   
			
		
	
		
			
				
							try  ( Connection  connection  =  DbManager . getConnection ( ) ;   
			
		
	
		
			
				
								 PreparedStatement  preparedStatement  =  connection . prepareStatement ( "UPDATE `dyn_character_skill` SET `skillsBaseID`=?, `CharacterID`=?, `trains`=? WHERE `UID`=?" ) )  {   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								preparedStatement . setInt ( 1 ,  characterSkill . getSkillsBase ( ) . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
								preparedStatement . setInt ( 2 ,  CharacterSkill . GetOwner ( characterSkill ) . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
								preparedStatement . setShort ( 3 ,  ( short )  characterSkill . getNumTrains ( ) ) ;   
			
		
	
		
			
				
								preparedStatement . setLong ( 4 ,  ( long )  characterSkill . getObjectUUID ( ) ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
								if  ( preparedStatement . executeUpdate ( )  ! =  0 )   
			
		
	
		
			
				
									characterSkill . syncTrains ( ) ;   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
							}  catch  ( SQLException  e )  {   
			
		
	
		
			
				
								Logger . error ( e ) ;   
			
		
	
		
			
				
							}   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
						}   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					}