2018-07-06 13:30:00 +00:00
package com.eu.habbo.habbohotel.bots ;
import com.eu.habbo.Emulator ;
import com.eu.habbo.habbohotel.rooms.RoomChatMessage ;
2018-09-12 16:45:00 +00:00
import com.eu.habbo.habbohotel.rooms.RoomUnitStatus ;
2020-10-12 11:18:52 +02:00
import com.eu.habbo.habbohotel.wired.WiredHandler ;
import com.eu.habbo.habbohotel.wired.WiredTriggerType ;
2018-07-06 13:30:00 +00:00
import com.eu.habbo.plugin.events.bots.BotServerItemEvent ;
import com.eu.habbo.threading.runnables.RoomUnitGiveHanditem ;
import com.eu.habbo.threading.runnables.RoomUnitWalkToRoomUnit ;
import gnu.trove.map.hash.THashMap ;
import gnu.trove.set.hash.THashSet ;
2020-05-04 22:24:09 +02:00
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
2018-07-06 13:30:00 +00:00
2018-09-28 19:25:00 +00:00
import java.sql.Connection ;
import java.sql.ResultSet ;
import java.sql.SQLException ;
import java.sql.Statement ;
2018-07-06 13:30:00 +00:00
import java.util.ArrayList ;
2019-03-18 01:22:00 +00:00
import java.util.Collections ;
2018-07-06 13:30:00 +00:00
import java.util.List ;
import java.util.Map ;
2019-05-26 21:14:53 +03:00
public class ButlerBot extends Bot {
2020-05-04 22:24:09 +02:00
private static final Logger LOGGER = LoggerFactory . getLogger ( ButlerBot . class ) ;
2018-09-28 19:25:00 +00:00
public static THashMap < THashSet < String > , Integer > serveItems = new THashMap < > ( ) ;
2018-07-06 13:30:00 +00:00
2019-05-26 21:14:53 +03:00
public ButlerBot ( ResultSet set ) throws SQLException {
2018-07-06 13:30:00 +00:00
super ( set ) ;
}
2019-05-26 21:14:53 +03:00
public ButlerBot ( Bot bot ) {
2018-07-06 13:30:00 +00:00
super ( bot ) ;
}
2019-05-26 21:14:53 +03:00
public static void initialise ( ) {
if ( serveItems = = null )
2018-09-28 19:25:00 +00:00
serveItems = new THashMap < > ( ) ;
2018-07-06 13:30:00 +00:00
serveItems . clear ( ) ;
2019-05-26 21:14:53 +03:00
try ( Connection connection = Emulator . getDatabase ( ) . getDataSource ( ) . getConnection ( ) ; Statement statement = connection . createStatement ( ) ; ResultSet set = statement . executeQuery ( " SELECT * FROM bot_serves " ) ) {
while ( set . next ( ) ) {
2018-07-06 13:30:00 +00:00
String [ ] keys = set . getString ( " keys " ) . split ( " ; " ) ;
2018-09-28 19:25:00 +00:00
THashSet < String > ks = new THashSet < > ( ) ;
2019-03-18 01:22:00 +00:00
Collections . addAll ( ks , keys ) ;
2018-07-06 13:30:00 +00:00
serveItems . put ( ks , set . getInt ( " item " ) ) ;
}
2019-05-26 21:14:53 +03:00
} catch ( SQLException e ) {
2020-05-04 22:24:09 +02:00
LOGGER . error ( " Caught SQL exception " , e ) ;
2018-07-06 13:30:00 +00:00
}
}
2019-05-26 21:14:53 +03:00
public static void dispose ( ) {
2018-07-06 13:30:00 +00:00
serveItems . clear ( ) ;
}
@Override
2019-05-26 21:14:53 +03:00
public void onUserSay ( final RoomChatMessage message ) {
2021-01-29 19:08:41 +01:00
if ( this . getRoomUnit ( ) . hasStatus ( RoomUnitStatus . MOVE ) | | this . getRoom ( ) = = null ) {
2018-07-06 13:30:00 +00:00
return ;
2021-01-29 19:08:41 +01:00
}
double distanceBetweenBotAndHabbo = this . getRoomUnit ( ) . getCurrentLocation ( ) . distance ( message . getHabbo ( ) . getRoomUnit ( ) . getCurrentLocation ( ) ) ;
if ( distanceBetweenBotAndHabbo < = Emulator . getConfig ( ) . getInt ( " hotel.bot.butler.commanddistance " ) ) {
2018-07-06 13:30:00 +00:00
2019-05-26 21:14:53 +03:00
if ( message . getUnfilteredMessage ( ) ! = null ) {
for ( Map . Entry < THashSet < String > , Integer > set : serveItems . entrySet ( ) ) {
2021-01-29 19:08:41 +01:00
for ( String keyword : set . getKey ( ) ) {
// Check if the string contains a certain keyword using a regex.
// If keyword = tea, teapot wouldn't trigger it.
if ( message . getUnfilteredMessage ( ) . toLowerCase ( ) . matches ( " \\ b " + keyword + " \\ b " ) ) {
// Enable plugins to cancel this event
2019-05-02 23:47:30 +01:00
BotServerItemEvent serveEvent = new BotServerItemEvent ( this , message . getHabbo ( ) , set . getValue ( ) ) ;
2019-05-26 21:14:53 +03:00
if ( Emulator . getPluginManager ( ) . fireEvent ( serveEvent ) . isCancelled ( ) ) {
2019-05-02 23:47:30 +01:00
return ;
}
2018-07-06 13:30:00 +00:00
2021-01-29 19:08:41 +01:00
// Start give handitem process
2019-05-26 21:14:53 +03:00
if ( this . getRoomUnit ( ) . canWalk ( ) ) {
2021-01-29 19:08:41 +01:00
final String key = keyword ;
final Bot bot = this ;
2018-07-06 13:30:00 +00:00
2021-01-29 19:08:41 +01:00
// Step 1: Look at Habbo
bot . lookAt ( serveEvent . habbo ) ;
// Step 2: Prepare tasks for when the Bot (carrying the handitem) reaches the Habbo
final List < Runnable > tasks = new ArrayList < > ( ) ;
2019-05-02 23:47:30 +01:00
tasks . add ( new RoomUnitGiveHanditem ( serveEvent . habbo . getRoomUnit ( ) , serveEvent . habbo . getHabboInfo ( ) . getCurrentRoom ( ) , serveEvent . itemId ) ) ;
tasks . add ( new RoomUnitGiveHanditem ( this . getRoomUnit ( ) , serveEvent . habbo . getHabboInfo ( ) . getCurrentRoom ( ) , 0 ) ) ;
2018-07-06 13:30:00 +00:00
2020-10-12 11:18:52 +02:00
tasks . add ( ( ) - > {
if ( this . getRoom ( ) ! = null ) {
2021-01-29 19:08:41 +01:00
String botMessage = Emulator . getTexts ( )
. getValue ( " bots.butler.given " )
. replace ( " %key% " , key )
. replace ( " %username% " , serveEvent . habbo . getHabboInfo ( ) . getUsername ( ) ) ;
if ( ! WiredHandler . handle ( WiredTriggerType . SAY_SOMETHING , this . getRoomUnit ( ) , this . getRoom ( ) , new Object [ ] { botMessage } ) ) {
bot . talk ( botMessage ) ;
2020-10-12 11:18:52 +02:00
}
}
} ) ;
2019-05-15 17:36:41 +01:00
2021-01-29 19:08:41 +01:00
List < Runnable > failedReached = new ArrayList < > ( ) ;
2020-04-23 18:08:37 +01:00
failedReached . add ( ( ) - > {
2021-01-29 19:08:41 +01:00
if ( distanceBetweenBotAndHabbo < = Emulator . getConfig ( ) . getInt ( " hotel.bot.butler.servedistance " , 8 ) ) {
for ( Runnable task : tasks ) {
task . run ( ) ;
2019-05-02 23:47:30 +01:00
}
}
} ) ;
2019-05-15 17:36:41 +01:00
2021-01-29 19:08:41 +01:00
// Give bot the handitem that it's going to give the Habbo
2019-05-02 23:47:30 +01:00
Emulator . getThreading ( ) . run ( new RoomUnitGiveHanditem ( this . getRoomUnit ( ) , serveEvent . habbo . getHabboInfo ( ) . getCurrentRoom ( ) , serveEvent . itemId ) ) ;
2019-05-15 17:36:41 +01:00
2021-01-29 19:08:41 +01:00
if ( distanceBetweenBotAndHabbo > Emulator . getConfig ( ) . getInt ( " hotel.bot.butler.reachdistance " , 3 ) ) {
2019-05-15 17:36:41 +01:00
Emulator . getThreading ( ) . run ( new RoomUnitWalkToRoomUnit ( this . getRoomUnit ( ) , serveEvent . habbo . getRoomUnit ( ) , serveEvent . habbo . getHabboInfo ( ) . getCurrentRoom ( ) , tasks , failedReached , Emulator . getConfig ( ) . getInt ( " hotel.bot.butler.reachdistance " , 3 ) ) ) ;
2019-05-26 21:14:53 +03:00
} else {
2019-05-15 17:36:41 +01:00
Emulator . getThreading ( ) . run ( failedReached . get ( 0 ) , 1000 ) ;
}
2019-05-26 21:14:53 +03:00
} else {
2020-10-12 11:18:52 +02:00
if ( this . getRoom ( ) ! = null ) {
2021-01-29 19:08:41 +01:00
this . getRoom ( ) . giveHandItem ( serveEvent . habbo , serveEvent . itemId ) ;
String msg = Emulator . getTexts ( ) . getValue ( " bots.butler.given " ) . replace ( " %key% " , keyword ) . replace ( " %username% " , serveEvent . habbo . getHabboInfo ( ) . getUsername ( ) ) ;
2020-10-12 11:18:52 +02:00
if ( ! WiredHandler . handle ( WiredTriggerType . SAY_SOMETHING , this . getRoomUnit ( ) , this . getRoom ( ) , new Object [ ] { msg } ) ) {
this . talk ( msg ) ;
}
}
2019-05-02 23:47:30 +01:00
}
return ;
2018-07-06 13:30:00 +00:00
}
}
}
}
2021-01-29 19:08:41 +01:00
}
2018-07-06 13:30:00 +00:00
}
}