2019-07-06 04:03:15 +00:00
package io.izzel.taboolib.common.listener ;
2019-07-05 16:17:54 +00:00
2020-03-08 08:31:34 +00:00
import com.google.common.collect.Lists ;
2020-03-24 16:24:44 +00:00
import io.izzel.taboolib.TabooLib ;
2019-07-05 16:17:54 +00:00
import io.izzel.taboolib.TabooLibAPI ;
2020-03-24 16:24:44 +00:00
import io.izzel.taboolib.common.loader.Startup ;
2020-05-05 18:07:05 +00:00
import io.izzel.taboolib.common.loader.StartupLoader ;
2020-04-16 14:39:47 +00:00
import io.izzel.taboolib.module.ai.SimpleAiSelector ;
2020-03-24 16:24:44 +00:00
import io.izzel.taboolib.module.command.lite.CommandBuilder ;
2019-07-06 10:50:05 +00:00
import io.izzel.taboolib.module.db.local.Local ;
import io.izzel.taboolib.module.db.local.LocalPlayer ;
2020-03-08 08:31:34 +00:00
import io.izzel.taboolib.module.hologram.Hologram ;
import io.izzel.taboolib.module.hologram.THologram ;
2019-07-05 16:17:54 +00:00
import io.izzel.taboolib.module.inject.TListener ;
2020-04-02 10:18:50 +00:00
import io.izzel.taboolib.module.light.TLight ;
2020-04-16 14:39:47 +00:00
import io.izzel.taboolib.module.lite.SimpleReflection ;
2019-07-06 04:03:15 +00:00
import io.izzel.taboolib.module.locale.logger.TLogger ;
2020-04-02 10:18:50 +00:00
import io.izzel.taboolib.module.nms.impl.Type ;
2019-07-05 16:17:54 +00:00
import io.izzel.taboolib.module.tellraw.TellrawJson ;
2020-01-23 10:14:06 +00:00
import io.izzel.taboolib.util.Files ;
2020-03-24 16:24:44 +00:00
import io.izzel.taboolib.util.book.BookFormatter ;
2019-07-06 10:50:05 +00:00
import io.izzel.taboolib.util.item.Items ;
2020-05-17 13:48:41 +00:00
import io.izzel.taboolib.util.lite.Effects ;
2020-01-14 14:35:46 +00:00
import io.izzel.taboolib.util.lite.Signs ;
2020-01-23 10:14:06 +00:00
import org.bukkit.Bukkit ;
2020-03-08 08:31:34 +00:00
import org.bukkit.Location ;
2020-05-17 13:48:41 +00:00
import org.bukkit.Particle ;
2020-05-05 18:07:05 +00:00
import org.bukkit.configuration.file.FileConfiguration ;
2020-03-24 16:24:44 +00:00
import org.bukkit.entity.Player ;
2020-04-16 14:39:47 +00:00
import org.bukkit.entity.Skeleton ;
2019-07-05 16:17:54 +00:00
import org.bukkit.event.EventHandler ;
2020-01-24 05:56:12 +00:00
import org.bukkit.event.EventPriority ;
2019-07-05 16:17:54 +00:00
import org.bukkit.event.Listener ;
import org.bukkit.event.server.ServerCommandEvent ;
2020-03-24 16:24:44 +00:00
import org.bukkit.inventory.meta.BookMeta ;
2020-05-17 13:48:41 +00:00
import org.bukkit.util.NumberConversions ;
import org.bukkit.util.Vector ;
2019-07-05 16:17:54 +00:00
2020-01-23 10:14:06 +00:00
import java.io.File ;
2020-01-14 14:35:46 +00:00
import java.util.Arrays ;
2020-03-24 16:24:44 +00:00
import java.util.List ;
2020-05-17 13:48:41 +00:00
import java.util.function.Consumer ;
2020-03-24 16:24:44 +00:00
import java.util.stream.Collectors ;
2020-01-14 14:35:46 +00:00
2019-07-05 16:17:54 +00:00
/ * *
* @author sky
* /
@TListener
2020-01-23 10:14:06 +00:00
public class ListenerCommand implements Listener {
2019-07-05 16:17:54 +00:00
2020-05-05 18:07:05 +00:00
static {
StartupLoader . register ( ListenerCommand . class ) ;
}
2020-04-17 12:06:52 +00:00
abstract static class Module {
2020-03-24 16:24:44 +00:00
abstract public String [ ] name ( ) ;
2020-05-17 13:48:41 +00:00
abstract public void run ( Player player , String [ ] args ) ;
2020-03-24 16:24:44 +00:00
}
List < Module > testUtil = Lists . newArrayList (
new Module ( ) {
@Override
public String [ ] name ( ) {
return new String [ ] { "json" , "tellrawJson" } ;
}
@Override
2020-05-17 13:48:41 +00:00
public void run ( Player player , String [ ] args ) {
2020-03-24 16:24:44 +00:00
TellrawJson . create ( )
. append ( "§8[§fTabooLib§8] §7TellrawJson: §f[" )
. append ( Items . getName ( player . getItemInHand ( ) ) ) . hoverItem ( player . getItemInHand ( ) )
. append ( "§f]" )
. send ( player ) ;
}
} ,
new Module ( ) {
@Override
public String [ ] name ( ) {
return new String [ ] { "sign" , "fakeSign" } ;
}
@Override
2020-05-17 13:48:41 +00:00
public void run ( Player player , String [ ] args ) {
2020-03-24 16:24:44 +00:00
Signs . fakeSign ( player , lines - > player . sendMessage ( "§8[§fTabooLib§8] §7FakeSign: §f" + Arrays . toString ( lines ) ) ) ;
}
} ,
new Module ( ) {
@Override
public String [ ] name ( ) {
return new String [ ] { "hd" , "hologram" } ;
}
@Override
2020-05-17 13:48:41 +00:00
public void run ( Player player , String [ ] args ) {
2020-03-24 16:24:44 +00:00
player . sendMessage ( "§8[§fTabooLib§8] §7Hologram." ) ;
Location location = player . getEyeLocation ( ) . add ( player . getLocation ( ) . getDirection ( ) ) ;
Hologram hologram = THologram . create ( location , "TabooLib" , player )
. flash ( Lists . newArrayList (
"§bT§fabooLib" ,
"§bTa§fbooLib" ,
"§bTab§fooLib" ,
"§bTabo§foLib" ,
"§bTaboo§fLib" ,
"§bTabooL§fib" ,
"§bTabooLi§fb" ,
"§bTabooLib" ,
"§bTabooLi§fb" ,
"§bTabooL§fib" ,
"§bTaboo§fLib" ,
"§bTabo§foLib" ,
"§bTab§fooLib" ,
"§bTa§fbooLib" ,
"§bT§fabooLib" ,
"§fTabooLib"
) , 1 ) . deleteOn ( 30 ) ;
}
} ,
new Module ( ) {
@Override
public String [ ] name ( ) {
return new String [ ] { "book" , "bookBuilder" } ;
}
@Override
2020-05-17 13:48:41 +00:00
public void run ( Player player , String [ ] args ) {
2020-03-24 16:24:44 +00:00
BookFormatter . writtenBook ( )
. generation ( BookMeta . Generation . COPY_OF_COPY )
. addPage ( TellrawJson . create ( )
. append ( "BookBuilder" )
. hoverText ( "HoverText" ) )
. open ( player ) ;
}
2020-04-02 10:18:50 +00:00
} ,
new Module ( ) {
@Override
public String [ ] name ( ) {
return new String [ ] { "light" } ;
}
@Override
2020-05-17 13:48:41 +00:00
public void run ( Player player , String [ ] args ) {
2020-04-02 10:18:50 +00:00
player . sendMessage ( "§8[§fTabooLib§8] §7Lighting. §a(+)" ) ;
TLight . create ( player . getLocation ( ) . getBlock ( ) , Type . BLOCK , 15 ) ;
2020-04-12 07:04:54 +00:00
TabooLib . getPlugin ( ) . runTask ( ( ) - > {
2020-04-02 10:18:50 +00:00
TLight . create ( player . getLocation ( ) . getBlock ( ) , Type . BLOCK , 5 ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7Lighting. §c(-)" ) ;
} , 20 ) ;
2020-04-12 07:04:54 +00:00
TabooLib . getPlugin ( ) . runTask ( ( ) - > {
2020-04-02 10:18:50 +00:00
TLight . delete ( player . getLocation ( ) . getBlock ( ) , Type . BLOCK ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7Lighting. §8(-)" ) ;
} , 40 ) ;
}
2020-04-16 14:39:47 +00:00
} ,
new Module ( ) {
@Override
public String [ ] name ( ) {
return new String [ ] { "simpleAI" , "ai" } ;
}
@Override
2020-05-17 13:48:41 +00:00
public void run ( Player player , String [ ] args ) {
2020-04-16 14:39:47 +00:00
player . sendMessage ( "§8[§fTabooLib§8] §7SimpleAI." ) ;
Skeleton skeleton = player . getWorld ( ) . spawn ( player . getLocation ( ) , Skeleton . class , c - > {
c . setCustomName ( "Fearless Skeleton" ) ;
c . setCustomNameVisible ( true ) ;
} ) ;
TabooLib . getPlugin ( ) . runTask ( ( ) - > {
SimpleAiSelector . getExecutor ( ) . getGoalAi ( skeleton ) . forEach ( ai - > {
player . sendMessage ( "§8[§fTabooLib§8] §7AI (Origin): §8" + SimpleReflection . getFieldValueChecked ( ai . getClass ( ) , ai , "a" , true ) ) ;
} ) ;
SimpleAiSelector . getExecutor ( ) . removeGoalAi ( skeleton , 3 ) ;
SimpleAiSelector . getExecutor ( ) . getGoalAi ( skeleton ) . forEach ( ai - > {
player . sendMessage ( "§8[§fTabooLib§8] §7AI (After): §8" + SimpleReflection . getFieldValueChecked ( ai . getClass ( ) , ai , "a" , true ) ) ;
} ) ;
} , 20 ) ;
}
2020-05-05 17:39:21 +00:00
} ,
new Module ( ) {
@Override
public String [ ] name ( ) {
return new String [ ] { "local" } ;
}
@Override
2020-05-17 13:48:41 +00:00
public void run ( Player player , String [ ] args ) {
2020-05-05 17:39:21 +00:00
TellrawJson . create ( ) . append ( "§8[§fTabooLib§8] §7LocalPlayer: " ) . append ( "§c[...]" ) . hoverText ( LocalPlayer . get ( player ) . saveToString ( ) ) . send ( player ) ;
2020-05-05 18:07:05 +00:00
long time = System . currentTimeMillis ( ) ;
FileConfiguration conf = LocalPlayer . get0 ( player ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7get: " + ( System . currentTimeMillis ( ) - time ) + "ms" ) ;
time = System . currentTimeMillis ( ) ;
LocalPlayer . set0 ( player , conf ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7set: " + ( System . currentTimeMillis ( ) - time ) + "ms" ) ;
2020-05-05 17:39:21 +00:00
}
2020-05-17 13:48:41 +00:00
} ,
new Module ( ) {
@Override
public String [ ] name ( ) {
return new String [ ] { "effects" , "effect" } ;
}
@Override
public void run ( Player player , String [ ] args ) {
if ( args . length < 2 ) {
player . sendMessage ( "§8[§fTabooLib§8] §7Effects:" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f LINE-[interval]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f POLYGON-[radius]-[interval]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f CIRCLE-[radius]-[rate]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f CONE-[height]-[radius]-[rate]-[circle rate]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f ATOM-[orbits]-[radius]-[rate]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f ELLIPSE-[radius]-[other radius]-[rate]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f INFINITY-[radius]-[rate]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f CRESCENT-[radius]-[rate]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f WARE_FUNCTION-[extend]-[height range]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f CYLINDER-[height]-[radius]-[rate]-[interval]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f SPHERE-[radius]-[rate]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f SPHERE_SPIKE-[radius]-[rate]-[chance]-[min]-[max]-[interval]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f RING-[rate]-[tube rate]-[radius]-[tube radius]" ) ;
TellrawJson . create ( ) . append ( "§8[§fTabooLib§8] §7-§f LIGHTING-" ) . append ( "§c[...]" ) . hoverText ( "[rate]-[direction]-[entries]-[branches]-[radius]-[offset]-[offset rate]-[length]-[length rate]-[branch]-[branch rate]" ) . send ( player ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f DNA-[radius]-[rate]-[extension]-[height]-[hydrogen bond dist]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f RECTANGLE-[rate]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f CAGE-[rate]-[bar rate]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f CUBE-[rate]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f CUBE_FILLED-[rate]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f CUBE_STRUCTURED-[rate]" ) ;
player . sendMessage ( "§8[§fTabooLib§8] §7-§f HYPERCUBE-[rate]-[size rate]-[cubes]" ) ;
return ;
}
List < String > a = Lists . newArrayList ( args [ 1 ] . toUpperCase ( ) . split ( "-" ) ) ;
Location locA = player . getEyeLocation ( ) ;
Location locB = player . getEyeLocation ( ) . add ( player . getLocation ( ) . getDirection ( ) . multiply ( 10 ) ) . add ( Vector . getRandom ( ) . multiply ( 5 ) ) ;
Consumer < Location > action1 = loc - > Effects . create ( Particle . FLAME , loc ) . count ( 1 ) . player ( player ) . play ( ) ;
Consumer < Location > action2 = loc - > Effects . create ( Particle . VILLAGER_HAPPY , loc ) . count ( 1 ) . player ( player ) . play ( ) ;
switch ( a . get ( 0 ) ) {
case "LINE" : {
Effects . buildLine ( locA , locB , action1 , orDob ( a , 1 , 0.1 ) ) ;
break ;
}
case "POLYGON" : {
Effects . buildPolygon ( locA , orDob ( a , 1 , 10 D ) , orDob ( a , 2 , 10 D ) , action1 ) ;
break ;
}
case "CIRCLE" : {
Effects . buildCircle ( locA , orDob ( a , 1 , 10 D ) , orDob ( a , 2 , 10 D ) , action1 ) ;
break ;
}
case "CONE" : {
Effects . buildCone ( locA , orDob ( a , 1 , 10 D ) , orDob ( a , 2 , 10 D ) , orDob ( a , 3 , 10 D ) , orDob ( a , 4 , 10 D ) , action1 ) ;
break ;
}
case "ATOM" : {
Effects . buildAtom ( locA , orInt ( a , 1 , 10 ) , orDob ( a , 2 , 10 D ) , orDob ( a , 3 , 10 D ) , action1 , action2 ) ;
break ;
}
case "ELLIPSE" : {
Effects . buildEllipse ( locA , orDob ( a , 1 , 10 D ) , orDob ( a , 2 , 10 D ) , orDob ( a , 3 , 10 D ) , action1 ) ;
break ;
}
case "INFINITY" : {
Effects . buildInfinity ( locA , orDob ( a , 1 , 10 D ) , orDob ( a , 2 , 10 D ) , action1 ) ;
break ;
}
case "CRESCENT" : {
Effects . buildCrescent ( locA , orDob ( a , 1 , 10 D ) , orDob ( a , 2 , 10 D ) , action1 ) ;
break ;
}
case "WARE_FUNCTION" : {
Effects . buildWaveFunction ( locA , orDob ( a , 1 , 10 D ) , orDob ( a , 2 , 10 D ) , orDob ( a , 3 , 10 D ) , orDob ( a , 4 , 10 D ) , action1 ) ;
break ;
}
case "CYLINDER" : {
Effects . buildCylinder ( locA , orDob ( a , 1 , 10 D ) , orDob ( a , 2 , 10 D ) , orDob ( a , 3 , 10 D ) , orDob ( a , 4 , 10 D ) , action1 ) ;
break ;
}
case "SPHERE" : {
Effects . buildSphere ( locA , orDob ( a , 1 , 10 D ) , orDob ( a , 2 , 10 D ) , action1 ) ;
break ;
}
case "SPHERE_SPIKE" : {
Effects . buildSphereSpike ( locA , orDob ( a , 1 , 10 D ) , orDob ( a , 2 , 10 D ) , orInt ( a , 3 , 10 ) , orDob ( a , 4 , 10 D ) , orDob ( a , 5 , 10 D ) , orDob ( a , 6 , 10 D ) , action1 ) ;
break ;
}
case "RING" : {
Effects . buildRing ( locA , orDob ( a , 1 , 10 D ) , orDob ( a , 2 , 10 D ) , orDob ( a , 3 , 10 D ) , orDob ( a , 4 , 10 D ) , action1 ) ;
break ;
}
case "LIGHTING" : {
Effects . buildLightning ( locA , locA . getDirection ( ) , orInt ( a , 1 , 10 ) , orInt ( a , 2 , 10 ) , orDob ( a , 3 , 10 ) , orDob ( a , 4 , 10 D ) , orDob ( a , 5 , 10 D ) , orDob ( a , 6 , 10 D ) , orDob ( a , 7 , 10 D ) , orDob ( a , 8 , 10 D ) , orDob ( a , 9 , 10 D ) , action1 ) ;
break ;
}
case "DNA" : {
Effects . buildDNA ( locA , orDob ( a , 1 , 10 D ) , orDob ( a , 2 , 10 D ) , orDob ( a , 3 , 10 D ) , orInt ( a , 4 , 10 ) , orInt ( a , 5 , 10 ) , action1 , action2 ) ;
break ;
}
case "RECTANGLE" : {
Effects . buildRectangle ( locA , locB , orDob ( a , 1 , 10 D ) , action1 ) ;
break ;
}
case "CAGE" : {
Effects . buildCage ( locA , locB , orDob ( a , 1 , 10 D ) , orDob ( a , 2 , 10 D ) , action1 ) ;
break ;
}
case "CUBE" : {
Effects . buildCube ( locA , locB , orDob ( a , 1 , 10 D ) , action1 ) ;
break ;
}
case "CUBE_FILLED" : {
Effects . buildCubeFilled ( locA , locB , orDob ( a , 1 , 10 D ) , action1 ) ;
break ;
}
case "CUBE_STRUCTURED" : {
Effects . buildCubeStructured ( locA , locB , orDob ( a , 1 , 10 D ) , action1 ) ;
break ;
}
case "HYPERCUBE" : {
Effects . buildHypercube ( locA , locB , orDob ( a , 1 , 10 D ) , orDob ( a , 2 , 10 D ) , orInt ( a , 3 , 10 ) , action1 ) ;
break ;
}
default :
player . sendMessage ( "§8[§fTabooLib§8] §7No Effect." ) ;
break ;
}
}
2020-01-14 14:35:46 +00:00
} ) ;
2020-03-24 16:24:44 +00:00
2020-04-02 10:18:50 +00:00
2020-03-24 16:24:44 +00:00
@Startup.Starting
public void init ( ) {
// 版本命令
CommandBuilder . create ( "taboolib" , TabooLib . getPlugin ( ) )
. aliases ( "lib" )
. execute ( ( sender , args ) - > {
sender . sendMessage ( "§8[§fTabooLib§8] §7Currently Version: §fv" + TabooLib . getVersion ( ) ) ;
} ) . build ( ) ;
// 调试命令
CommandBuilder . create ( "taboolibtest" , TabooLib . getPlugin ( ) )
. permission ( "*" )
. aliases ( "libtest" )
. tab ( ( sender , args ) - > testUtil . stream ( ) . flatMap ( module - > Arrays . stream ( module . name ( ) ) ) . filter ( name - > name . toLowerCase ( ) . startsWith ( args [ 0 ] ) ) . collect ( Collectors . toList ( ) ) )
. execute ( ( sender , args ) - > {
if ( sender instanceof Player ) {
if ( args . length = = 0 ) {
sender . sendMessage ( "§8[§fTabooLib§8] §7/libtest §8[...]" ) ;
return ;
}
for ( Module module : testUtil ) {
for ( String name : module . name ( ) ) {
if ( name . equalsIgnoreCase ( args [ 0 ] ) ) {
2020-05-17 13:48:41 +00:00
module . run ( ( Player ) sender , args ) ;
2020-03-24 16:24:44 +00:00
return ;
}
}
}
2020-05-17 13:48:41 +00:00
sender . sendMessage ( "§8[§fTabooLib§8] §7Test: §f" + testUtil . stream ( ) . map ( i - > i . name ( ) [ 0 ] ) . collect ( Collectors . joining ( ", " ) ) ) ;
2020-03-24 16:24:44 +00:00
}
} ) . build ( ) ;
2019-07-08 13:23:49 +00:00
}
2020-01-24 05:56:12 +00:00
@EventHandler ( priority = EventPriority . LOWEST )
2019-07-05 16:17:54 +00:00
public void cmd ( ServerCommandEvent e ) {
if ( e . getCommand ( ) . equalsIgnoreCase ( "saveFiles" ) ) {
2019-07-06 10:50:05 +00:00
Local . saveFiles ( ) ;
LocalPlayer . saveFiles ( ) ;
2019-07-05 16:17:54 +00:00
TLogger . getGlobalLogger ( ) . info ( "Successfully." ) ;
} else if ( e . getCommand ( ) . equalsIgnoreCase ( "tDebug" ) ) {
if ( TabooLibAPI . isDebug ( ) ) {
2019-07-09 12:00:16 +00:00
TabooLibAPI . debug ( false ) ;
2019-07-05 16:17:54 +00:00
TLogger . getGlobalLogger ( ) . info ( "&cDisabled." ) ;
} else {
2019-07-09 12:00:16 +00:00
TabooLibAPI . debug ( true ) ;
2019-07-05 16:17:54 +00:00
TLogger . getGlobalLogger ( ) . info ( "&aEnabled." ) ;
}
2020-02-02 07:30:29 +00:00
} else if ( e . getCommand ( ) . equalsIgnoreCase ( "libUpdate" ) ) {
2020-01-24 05:56:12 +00:00
e . setCancelled ( true ) ;
2020-02-02 07:30:29 +00:00
e . getSender ( ) . sendMessage ( "§8[§fTabooLib§8] §cWARNING §7| §4Update TabooLib will force to restart your server. Please confirm this action by type §c/libupdateconfirm" ) ;
} else if ( e . getCommand ( ) . equalsIgnoreCase ( "libUpdateConfirm" ) | | e . getCommand ( ) . equalsIgnoreCase ( "libUpdate confirm" ) ) {
2020-01-24 05:56:12 +00:00
e . getSender ( ) . sendMessage ( "§8[§fTabooLib§8] §7Downloading TabooLib file..." ) ;
2020-01-23 10:14:06 +00:00
Files . downloadFile ( "https://skymc.oss-cn-shanghai.aliyuncs.com/plugins/TabooLib.jar" , new File ( "libs/TabooLib.jar" ) ) ;
2020-01-24 05:56:12 +00:00
e . getSender ( ) . sendMessage ( "§8[§fTabooLib§8] §2Download completed, the server will restart in 3 secs" ) ;
2020-01-23 10:14:06 +00:00
try {
Thread . sleep ( 3000L ) ;
} catch ( InterruptedException e1 ) {
e1 . printStackTrace ( ) ;
}
Bukkit . shutdown ( ) ;
2019-07-05 16:17:54 +00:00
}
}
2020-05-17 13:48:41 +00:00
private static int orInt ( List < String > list , int index , int def ) {
return list . size ( ) > index ? NumberConversions . toInt ( list . get ( index ) ) : def ;
}
private static double orDob ( List < String > list , int index , double def ) {
return list . size ( ) > index ? NumberConversions . toDouble ( list . get ( index ) ) : def ;
}
2019-07-05 16:17:54 +00:00
}