Compare commits

..

100 Commits

Author SHA1 Message Date
Mike Primm 9e29cb8e44 Turn back on loading of unpopulated chunks - flag in CB doesn't appear
to be reliable
2012-08-09 17:52:10 -05:00
Mike Primm fca05e399a Set to 0.70.1 2012-08-08 23:47:07 -05:00
Mike Primm a6490743ca Bump to 0.80 2012-08-07 23:51:33 -05:00
Mike Primm 7da1051d5f Clean up spout-textures.txt when spout is disabled (avoid block id conflicts) 2012-08-07 23:39:14 -05:00
Mike Primm ddf14b7c3b Add spout controls (enable/disable, use-existing-textures), load other spout mods first 2012-08-07 23:20:00 -05:00
Mike Primm 38a4d869f6 Add support for AsyncPlayerChatEvent - make silly nagging STFU - still support 1.2.5 2012-08-04 23:02:24 -05:00
Mike Primm 905802e558 Streamline chunk load/unload, ignore unpopulated chunks, handle broken Spout mods better 2012-08-02 02:07:17 -05:00
Mike Primm 30db9c04b6 Bump to 0.70 2012-07-30 22:26:22 -05:00
Mike Primm 2401eff676 Add current/max player count on player list 2012-07-30 21:42:59 -05:00
Mike Primm b5700bd462 Switch player position to be based on eye/head position - fix hideifundercover problem when in minecarts 2012-07-30 21:00:52 -05:00
Mike Primm 5d9677b350 Add configuration settings for optional URL overrides 2012-07-30 20:35:46 -05:00
Mike Primm cf77737f85 Add API to test for player info protection 2012-07-29 11:01:59 -05:00
Mike Primm 8a03a29f0a Add Player Visibility Set API support 2012-07-28 22:56:12 -05:00
Mike Primm 8031110a59 Bump to 0.60 2012-07-22 19:07:21 -05:00
Mike Primm cf0c60d877 Add setting for IC2 Nuclear Control rendering support 2012-07-22 18:37:31 -05:00
Mike Primm 0a4761f525 Add Ender Storage configuration option 2012-07-22 16:49:08 -05:00
Mike Primm ab46d250b1 Add tubestuff configuration option 2012-07-22 00:08:48 -05:00
Mike Primm df8013489d Add skin-url setting: allow custom source URL for skins 2012-07-21 01:39:14 -05:00
Mike Primm 133d3078d7 Cleanup warnings 2012-07-21 00:35:41 -05:00
Mike Primm 2a056033b8 Add setting for enabling IronChest support 2012-07-17 01:19:29 -05:00
Mike Primm a5428b56f1 Handle exceptions from Bukkit on chunk loads - keep from being killed by them... 2012-07-16 00:51:13 -05:00
Mike Primm ff79c2f4fc Add 'blockredstone' trigger (default to disabled) 2012-07-11 02:09:51 -05:00
Mike Primm 18462b5caf Add LICENSE 2012-07-06 12:14:25 -05:00
Mike Primm ebfa3eaec1 Bump to 0.50 (I'd like to get to 1.0 someday...) 2012-07-01 09:10:01 -05:00
Mike Primm 96673f0fb3 More protection against exceptions for blocks at top of world 2012-05-23 08:13:47 -05:00
Mike Primm fc451fd002 Prevent traps by stupid mods that think BlockBreak events are good to send without blocks.... 2012-05-22 23:53:29 -05:00
Mike Primm 2f1b1789fd Bump to 0.40 2012-05-20 18:45:40 -05:00
Mike Primm 01b054e972 Make logo component position settable, allow more than one instance 2012-05-19 22:12:01 -05:00
Mike Primm 5d35205cae Handle chunk cache loading in platform module 2012-05-19 15:50:20 -05:00
Mike Primm 58c7d6378c Add IC2 Compact Solars support setting 2012-05-11 22:35:07 -05:00
Mike Primm d95213e7dd Fix hideifundercover on The End 2012-05-09 00:29:04 -05:00
Mike Primm 4f5063155e Add forestry-support flag to configuration.txt 2012-05-08 22:40:08 -05:00
Mike Primm 2d4e233005 Bump to 0.39 2012-05-06 17:25:48 -05:00
Mike Primm afc0d9bd6b Bump to 0.38 2012-04-22 18:10:39 -05:00
Mike Primm 267b423ff1 Update POM to use Bukkit 1.2.5-R1.0 2012-04-17 21:57:59 -05:00
Mike Primm d523ce8a41 Add 'protected-player-info' option - require login + privilege to see players other than self 2012-04-16 22:54:31 -05:00
Mike Primm ee7e6eedc8 Disable blockphysics and blockfromto by default - fires too much in recent CB versions, and just not needed 99% of the time 2012-04-13 23:20:36 -05:00
Mike Primm 4d6d156e9c Declare world permission nodes 2012-04-11 01:19:12 -05:00
Mike Primm 177310a949 Add lctrees-support setting (enable LC Trees++ support) 2012-04-09 18:05:07 -05:00
Mike Primm 0707953718 Fix handling of unknown biomes (For Trees++) 2012-04-09 18:03:32 -05:00
Mike Primm 8546b2205e Bump to 0.37 2012-04-04 01:04:26 -05:00
Mike Primm d154f23bab Add 'chatlengthlimit' setting - control max chat message length 2012-04-03 23:23:29 -05:00
Mike Primm 0b38a4cec8 Bump to 0.36.3 2012-04-03 13:36:44 -05:00
Mike Primm 02aedc9478 Set to 0.36.2 2012-03-31 00:39:50 -05:00
Mike Primm 3702e07210 Add online-only permissions message 2012-03-31 00:24:46 -05:00
Mike Primm 6afb0d9b92 Add webchat-permissions setting, fix bPerms, PermissionsBukkit 2012-03-31 00:23:22 -05:00
Mike Primm 1d6cedeeb0 Fix bPermissions 2012-03-30 22:07:33 -05:00
Mike Primm a3528e9937 Bump back to 0.37 2012-03-28 23:37:44 -05:00
Mike Primm bae2a48a83 Handle when Spout explodes during startup 2012-03-28 21:23:36 -05:00
Mike Primm 11b2123f14 Fix lighting problem with custom spout blocks 2012-03-28 21:04:12 -05:00
Mike Primm f93f37deea Handle 1.2.x world height in chunks with Spout plus custom blocks 2012-03-28 11:39:39 -05:00
Mike Primm cf5e2e00e6 Bump to 0.36.1 2012-03-27 23:21:54 -05:00
Mike Primm 121c1050ce Bump to 0.37 2012-03-25 23:21:36 -05:00
Mike Primm 4f6dd1d778 Add chatnotpermitted message 2012-03-25 23:09:39 -05:00
Mike Primm 3ed44ee905 Add dynmap.webchat permission - option to restrict webchat rights 2012-03-25 14:29:49 -05:00
Mike Primm 8f9d2c01c2 Add player permissions check API 2012-03-24 23:29:31 -05:00
Mike Primm faa1948225 Add direct support for PeX, bPerms, PermBukkit 2012-03-23 22:02:13 -05:00
Mike Primm 67e0bd2f2c Merge remote branch 'upstream/master' 2012-03-20 08:02:58 -05:00
Mike Primm 4fc8a53eb0 Add /dynmap webregister permissions and help 2012-03-20 08:02:29 -05:00
Mike Primm 1c1937c80c Add external server login support 2012-03-19 23:02:41 -05:00
Mike Primm f24dfd6c3e First pass login security support (internal server only) 2012-03-18 21:04:46 -05:00
Mike Primm 86b87e78e3 Add misc/swampgrasscolor.png and misc/swampfoliagecolor.png support 2012-03-17 00:34:33 -05:00
Mike Primm 34fe8316c3 Handle custom water color shading (misc/watercolorX.png) 2012-03-16 22:48:33 -05:00
Mike Primm 387844b9dc Bump to 0.36 2012-03-13 11:20:25 -05:00
Mike Primm a493f85bcf Bump to 0.35 (API changes) 2012-03-13 10:55:34 -05:00
Mike Primm 1ab7a8ddbf Handle lighting checks above world top 2012-03-13 01:10:47 -05:00
Mike Primm bdb2620ca9 Fix typo 2012-03-12 18:46:12 -05:00
Mike Primm d8812ce575 Add 'visiblelines' setting for 'chatbox' - control visible space on scrollback 2012-03-12 01:32:58 -05:00
Mike Primm 6c618fa727 More cleanup 2012-03-11 19:56:54 -05:00
Mike Primm a9214502cf More config cleanup 2012-03-11 18:49:58 -05:00
Mike Primm ef0ad40496 Update to 1.2 biome shading model (1.1 maps will be 1.2-style shaded - sorry) 2012-03-11 16:17:32 -05:00
Mike Primm 2628559b55 Retire old beta render options (correct-biome-shading, smooth-biome-shading, waterbiomeshaded, swampshaded, fence-to-block-join) 2012-03-11 16:14:22 -05:00
Mike Primm 11021720c7 Add new commands and security settings for circle markers 2012-03-10 18:14:22 -06:00
Mike Primm de4fdb2b0c Fix handling of normalized world names 2012-03-10 15:07:13 -06:00
Mike Primm ecdb50920e Try fix for getHighestBlockY() not working as advertised 2012-03-09 14:33:51 -06:00
Mike Primm 50f7382b7a Bump to 0.34.1 2012-03-04 23:56:17 -06:00
Mike Primm 56875a05d4 Fix nether render in 1.1 and 1.2 2012-03-04 20:21:01 -06:00
Mike Primm f392eb1344 Drop listeners for disabled triggers (overhead on very big servers) 2012-03-03 23:20:04 -06:00
Mike Primm a41e052f51 Big performance boost - exploit empty section data, max block y in ray trace 2012-03-03 09:33:07 -06:00
Mike Primm 0e97fedd6b Add support for 'blockgrow' trigger (for growing crops) 2012-02-28 23:40:52 -06:00
Mike Primm 9d97f86b7f Add config setting for ComputerCraft rendering 2012-02-28 22:23:58 -06:00
Mike Primm 516125e87b Support world names with '/' characters (substitute internally with '-') 2012-02-27 22:14:48 -06:00
Mike Primm e52234336e Bump to 0.34 2012-02-26 21:11:20 -06:00
Mike Primm af10e942a9 Update bukkit library to 1.1-R5 2012-02-24 21:13:31 -06:00
Mike Primm 1e52061b27 Update Jetty to 8.1.1 2012-02-24 16:44:55 -06:00
Mike Primm b0ca796213 Add disable API for chat-to-web processing (for mods to replace it) 2012-02-22 23:10:13 -06:00
Mike Primm cac8527d76 Add sealevel and world height for client info 2012-02-22 21:12:29 -06:00
Mike Primm 35cf3ed8fa More improvement on blockphysics and blockfromto chatter 2012-02-22 21:00:13 -06:00
Mike Primm 888051d497 Try to reduce excessive firing of blockfromto and blockphysics triggers 2012-02-22 08:07:13 -06:00
Mike Primm 559bc0ef55 Add optional send message pushbutton on web ui (chatbox component) 2012-02-22 00:51:13 -06:00
Mike Primm b85bd1dce7 Make player-join processing monitor priority - give VNP a chance to hide it 2012-02-22 00:26:03 -06:00
Mike Primm 87bbd3023e Fix more 1.1-R5 breaks... 2012-02-21 23:34:00 -06:00
Mike Primm fa80af8e81 Remove HeroChat code - HeroChat 4 API doesn't work as of 1.1-R5 2012-02-19 15:18:17 -06:00
Mike Primm 0c9057949d Add global image-format setting - default for all HD maps 2012-02-19 14:56:45 -06:00
Mike Primm f95a832cae Fix section size 2012-02-17 00:13:33 -06:00
Mike Primm 2e2fbec8f9 Add section empty methods 2012-02-16 22:45:34 -06:00
Mike Primm 63a638f96e Fix dependency on bukkit-bleeding level bukkit 2012-02-16 07:53:15 -06:00
Mike Primm bcf679b078 Chunk section prep 2012-02-15 22:34:45 -06:00
Mike Primm 5ad4ba285b Strip out obsolete pre 1.1 bukkit workarounds, fixes 2012-02-14 20:54:36 -06:00
Mike Primm 71185b06d6 Bump to 0.33 2012-02-13 21:30:12 -06:00
22 changed files with 1590 additions and 959 deletions
+201
View File
@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+23 -17
View File
@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.dynmap</groupId>
<artifactId>dynmap</artifactId>
<version>0.32</version>
<version>0.70.1</version>
<name>dynmap</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -133,7 +133,7 @@
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>[1.1-R1-SNAPSHOT,)</version>
<version>[1.2.5-R4.0,1.7)</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
@@ -144,21 +144,6 @@
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>8.0.1.v20110908</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>8.0.1.v20110908</version>
</dependency>
<dependency>
<groupId>org.dynmap</groupId>
@@ -173,5 +158,26 @@
<version>dev-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ru.tehkode</groupId>
<artifactId>PermissionsEx</artifactId>
<version>1.19.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/PermissionsEx.jar</systemPath>
</dependency>
<dependency>
<groupId>de.bananaco</groupId>
<artifactId>bPermissions</artifactId>
<version>2.9.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/bpermissions.jar</systemPath>
</dependency>
<dependency>
<groupId>com.platymuus.bukkit.permissions</groupId>
<artifactId>PermissionsBukkit</artifactId>
<version>1.6</version>
<scope>system</scope>
<systemPath>${project.basedir}/PermissionsBukkit.jar</systemPath>
</dependency>
</dependencies>
</project>
+5
View File
@@ -16,6 +16,11 @@
<includes>
<include>version.js</include></includes>
<filtered>true</filtered></fileSet>
<fileSet>
<directory>${project.basedir}</directory>
<outputDirectory>/dynmap</outputDirectory>
<includes>
<include>LICENSE</include></includes></fileSet>
</fileSets>
<files>
<file>
@@ -1,80 +0,0 @@
package org.dynmap.bukkit;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.bukkit.block.Block;
import org.dynmap.Log;
/**
* Wrapper for accessing raw light levels for given block
*/
public class BlockLightLevel {
private Method gethandle;
private Method getrawlight;
private Object enum_sky;
private Object enum_block;
private boolean ready;
@SuppressWarnings({ "unchecked", "rawtypes" })
public BlockLightLevel() {
/* Get CraftChunk.getChunkSnapshot(boolean,boolean,boolean) and CraftChunk.getHandle() */
try {
Class c = Class.forName("org.bukkit.craftbukkit.CraftChunk");
gethandle = c.getDeclaredMethod("getHandle", new Class[0]);
Class enumskyblock = Class.forName("net.minecraft.server.EnumSkyBlock");
Object[] enumvals = enumskyblock.getEnumConstants();
for(int i = 0; i < enumvals.length; i++) {
String ev = enumvals[i].toString();
if(ev.equals("Sky")) {
enum_sky = enumvals[i];
}
else if(ev.equals("Block")) {
enum_block = enumvals[i];
}
}
Class cc = Class.forName("net.minecraft.server.Chunk");
getrawlight = cc.getDeclaredMethod("a", new Class[] { enumskyblock, int.class, int.class, int.class });
} catch (ClassNotFoundException cnfx) {
} catch (NoSuchMethodException nsmx) {
}
if((gethandle != null) && (enum_sky != null) && (enum_block != null) && (getrawlight != null)) {
ready = true;
}
else {
Log.warning("Block raw light level API not available");
}
}
public boolean isReady() {
return ready;
}
public int getSkyLightLevel(Block b) {
try {
Object hand = gethandle.invoke(b.getChunk());
if(hand != null) {
Integer v = (Integer)getrawlight.invoke(hand, enum_sky, b.getX() & 0xF, b.getY() & 0x7F, b.getZ() & 0xF);
return v;
}
} catch (InvocationTargetException itx) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
return -1;
}
public int getBlockLightLevel(Block b) {
try {
Object hand = gethandle.invoke(b.getChunk());
if(hand != null) {
Integer v = (Integer)getrawlight.invoke(hand, enum_block, b.getX() & 0xF, b.getY() & 0x7F, b.getZ() & 0xF);
return v;
}
} catch (InvocationTargetException itx) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
return -1;
}
}
@@ -6,6 +6,8 @@ import java.util.List;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionDefault;
import org.dynmap.DynmapChunk;
import org.dynmap.DynmapLocation;
import org.dynmap.DynmapWorld;
@@ -13,17 +15,20 @@ import org.dynmap.utils.MapChunkCache;
public class BukkitWorld extends DynmapWorld {
private World world;
private static BlockLightLevel bll = new BlockLightLevel();
private World.Environment env;
private boolean skylight;
public BukkitWorld(World w) {
super(w.getName(), w.getMaxHeight());
super(w.getName(), w.getMaxHeight(), w.getSeaLevel());
world = w;
env = world.getEnvironment();
skylight = (env == World.Environment.NORMAL);
new Permission("dynmap.world." + getName(), "Dynmap access for world " + getName(), PermissionDefault.OP);
}
/* Test if world is nether */
@Override
public boolean isNether() {
return world.getEnvironment() == World.Environment.NETHER;
return env == World.Environment.NETHER;
}
/* Get world spawn location */
@Override
@@ -31,7 +36,7 @@ public class BukkitWorld extends DynmapWorld {
DynmapLocation dloc = new DynmapLocation();
Location sloc = world.getSpawnLocation();
dloc.x = sloc.getBlockX(); dloc.y = sloc.getBlockY();
dloc.z = sloc.getBlockZ(); dloc.world = sloc.getWorld().getName();
dloc.z = sloc.getBlockZ(); dloc.world = normalizeWorldName(sloc.getWorld().getName());
return dloc;
}
/* Get world time */
@@ -67,19 +72,19 @@ public class BukkitWorld extends DynmapWorld {
/* Test if sky light level is requestable */
@Override
public boolean canGetSkyLightLevel() {
return bll.isReady();
return skylight;
}
/* Return sky light level */
@Override
public int getSkyLightLevel(int x, int y, int z) {
return bll.getSkyLightLevel(world.getBlockAt(x, y, z));
return world.getBlockAt(x, y, z).getLightFromSky();
}
/**
* Get world environment ID (lower case - normal, the_end, nether)
*/
@Override
public String getEnvironment() {
return world.getEnvironment().name().toLowerCase();
return env.name().toLowerCase();
}
/**
* Get map chunk cache for world
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -9,11 +9,13 @@ import java.lang.reflect.Field;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import javax.imageio.ImageIO;
import org.bukkit.Material;
import org.bukkit.plugin.Plugin;
import org.dynmap.DynmapCore;
import org.dynmap.Log;
import org.getspout.spoutapi.block.design.BlockDesign;
import org.getspout.spoutapi.block.design.GenericBlockDesign;
@@ -53,13 +55,42 @@ public class SpoutPluginBlocks {
sb.append("block:id=" + blk.getCustomId() + ",allfaces=12049,transparency=TRANSPARENT\n");
}
private static String fixIDString(String id) {
StringBuilder sb = new StringBuilder();
int len = id.length();
sb.setLength(len);
for(int i = 0; i < len; i++) {
char c = id.charAt(i);
if(Character.isJavaIdentifierStart(c)) {
sb.setCharAt(i, c);
}
else {
sb.setCharAt(i, '_');
}
}
return sb.toString();
}
/* Process spout blocks - return true if something changed */
public boolean processSpoutBlocks(File datadir) {
public boolean processSpoutBlocks(DynmapPlugin plugin, DynmapCore core) {
/* First, see if any spout plugins that need to be enabled */
for(Plugin p : plugin.getServer().getPluginManager().getPlugins()) {
List<String> dep = p.getDescription().getDepend();
if((dep != null) && (dep.contains("Spout"))) {
Log.info("Found Spout plugin: " + p.getName());
if(p.isEnabled() == false) {
plugin.getPluginLoader().enablePlugin(p);
}
}
}
File datadir = core.getDataFolder();
if(textYPosField == null) {
if(initSpoutAccess() == false)
return false;
}
HashMap<String, String> texturelist = new HashMap<String, String>();
boolean use_existing_texture = core.configuration.getBoolean("spout/use-existing-textures", true);
int cnt = 0;
File f = new File(datadir, "texturepacks/standard/spout");
@@ -72,7 +103,7 @@ public class SpoutPluginBlocks {
/* Loop through blocks - try to freshen files, if needed */
for(CustomBlock b : cb) {
BlockDesign bd = b.getBlockDesign();
String blkid = bd.getTexturePlugin() + "." + b.getName();
String blkid = bd.getTexturePlugin() + "." + fixIDString(b.getName());
/* If not GenericCubiodBlockDesign, we don't handle it */
if((bd instanceof GenericCuboidBlockDesign) == false) {
Log.info("Block " + blkid + " not suppored - only cubiod blocks");
@@ -109,53 +140,59 @@ public class SpoutPluginBlocks {
String txtid = texturelist.get(txname); /* Get texture */
if(txtid == null) { /* Not found yet */
File imgfile = new File(f, blkid + ".png");
BufferedImage img = null;
boolean urlloaded = false;
try {
URL url = new URL(txname);
img = ImageIO.read(url); /* Load skin for player */
urlloaded = true;
} catch (IOException iox) {
if(txname.startsWith("http") == false) { /* Not URL - try file */
File tf = new File(txname);
if(tf.exists() == false) {
/* Horrible hack - try to find temp file (some SpoutMaterials versions) */
try {
File tmpf = File.createTempFile("dynmap", "test");
tf = new File(tmpf.getParent(), txname);
tmpf.delete();
} catch (IOException iox2) {}
/* If not reusing loaded textures OR not previously loaded */
if((!use_existing_texture) || (!imgfile.exists())) {
BufferedImage img = null;
boolean urlloaded = false;
try {
URL url = new URL(txname);
img = ImageIO.read(url); /* Load skin for player */
urlloaded = true;
} catch (IOException iox) {
if(txname.startsWith("http") == false) { /* Not URL - try file */
File tf = new File(txname);
if(tf.exists() == false) {
/* Horrible hack - try to find temp file (some SpoutMaterials versions) */
try {
File tmpf = File.createTempFile("dynmap", "test");
tf = new File(tmpf.getParent(), txname);
tmpf.delete();
} catch (IOException iox2) {}
}
if(tf.exists()) {
try {
img = ImageIO.read(tf);
urlloaded = true;
} catch (IOException iox3) {
}
}
}
if(tf.exists()) {
try {
img = ImageIO.read(tf);
urlloaded = true;
} catch (IOException iox3) {
if(img == null) {
Log.severe("Error loading texture for custom block '" + blkid + "' (" + b.getCustomId() + ") from " + txname + "(" + iox.getMessage() + ")");
if(imgfile.exists()) {
try {
img = ImageIO.read(imgfile); /* Load existing */
Log.info("Loaded cached texture file for " + blkid);
} catch (IOException iox2) {
Log.severe("Error loading cached texture file for " + blkid + " - " + iox2.getMessage());
}
}
}
}
if(img == null) {
Log.severe("Error loading texture for custom block '" + blkid + "' (" + b.getCustomId() + ") from " + txname + "(" + iox.getMessage() + ")");
if(imgfile.exists()) {
try {
img = ImageIO.read(imgfile); /* Load existing */
Log.info("Loaded cached texture file for " + blkid);
} catch (IOException iox2) {
Log.severe("Error loading cached texture file for " + blkid + " - " + iox2.getMessage());
}
if(img != null) {
try {
if(urlloaded)
ImageIO.write(img, "png", imgfile);
} catch (IOException iox) {
Log.severe("Error writing " + blkid + ".png");
} finally {
img.flush();
}
}
}
if(img != null) {
try {
if(urlloaded)
ImageIO.write(img, "png", imgfile);
} catch (IOException iox) {
Log.severe("Error writing " + blkid + ".png");
} finally {
img.flush();
}
if(imgfile.exists()) { /* If exists now, log it */
String tfid = "txtid" + texturelist.size();
sb.append("texturefile:id=" + tfid + ",filename=spout/" + blkid + ".png,xcount=" + w/sz + ",ycount=" + h/sz + "\n");
texturelist.put(txname, tfid);
@@ -166,7 +203,7 @@ public class SpoutPluginBlocks {
blks.add(b);
sb.append("block:id=" + b.getCustomId() + ",data=*,bottom=" + txtidx[0] + ",west=" +txtidx[1] + ",south=" + txtidx[2] + ",east=" + txtidx[3] + ",north="+txtidx[4]+",top="+txtidx[5]);
if(b.isOpaque() == false)
if(b.getBlockId() == Material.GLASS.getId())
sb.append(",transparency=TRANSPARENT");
sb.append(",txtid=" + txfileid + "\n");
cnt++;
@@ -1,24 +1,33 @@
package org.dynmap.bukkit.permissions;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.dynmap.Log;
public class BukkitPermissions implements PermissionProvider {
String name;
protected String name;
protected Map<String, Boolean> pd;
public static BukkitPermissions create(String name) {
public static BukkitPermissions create(String name, Map<String,Boolean> pd) {
try {
Class.forName("org.bukkit.permissions.PermissibleBase"); /* See if class exists */
} catch (ClassNotFoundException cnfx) {
return null;
}
Log.info("Using Bukkit Permissions (superperms) for access control");
return new BukkitPermissions(name);
Log.info("Web interface permissions only available for online users");
return new BukkitPermissions(name, pd);
}
public BukkitPermissions(String name) {
public BukkitPermissions(String name, Map<String, Boolean> pd) {
this.name = name;
this.pd = pd;
}
@Override
@@ -28,4 +37,33 @@ public class BukkitPermissions implements PermissionProvider {
? player.hasPermission(name + "." + permission) || player.hasPermission(name + ".*")
: true;
}
@Override
public Set<String> hasOfflinePermissions(String player, Set<String> perms) {
Player p = Bukkit.getPlayerExact(name);
HashSet<String> hasperms = null;
if (p != null) {
hasperms = new HashSet<String>();
for(String perm : perms) {
if (p.hasPermission(name + "." + perm)) {
hasperms.add(perm);
}
}
}
return hasperms;
}
@Override
public boolean hasOfflinePermission(String player, String perm) {
Player p = Bukkit.getPlayerExact(player);
if (p != null) {
return p.hasPermission(name + "." + perm);
}
else {
OfflinePlayer op = Bukkit.getOfflinePlayer(player);
if((op != null) && op.isOp()) {
return true;
}
return false;
}
}
}
@@ -1,5 +1,9 @@
package org.dynmap.bukkit.permissions;
import java.util.HashSet;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -13,6 +17,7 @@ public class NijikokunPermissions implements PermissionProvider {
String name;
PermissionHandler permissions;
Plugin plugin;
String defworld;
public static NijikokunPermissions create(Server server, String name) {
Plugin permissionsPlugin = server.getPluginManager().getPlugin("Permissions");
@@ -20,6 +25,9 @@ public class NijikokunPermissions implements PermissionProvider {
return null;
server.getPluginManager().enablePlugin(permissionsPlugin);
if(permissionsPlugin.isEnabled() == false)
return null;
Log.info("Using Permissions " + permissionsPlugin.getDescription().getVersion() + " for access control");
return new NijikokunPermissions(permissionsPlugin, name);
}
@@ -27,6 +35,7 @@ public class NijikokunPermissions implements PermissionProvider {
public NijikokunPermissions(Plugin permissionsPlugin, String name) {
this.name = name;
plugin = permissionsPlugin;
defworld = Bukkit.getServer().getWorlds().get(0).getName();
}
@Override
@@ -38,4 +47,25 @@ public class NijikokunPermissions implements PermissionProvider {
? permissions.has(player, name + "." + permission) || permissions.has(player, name + ".*")
: true;
}
@Override
public Set<String> hasOfflinePermissions(String player, Set<String> perms) {
if(permissions == null)
permissions = ((Permissions)plugin).getHandler();
HashSet<String> hasperms = new HashSet<String>();
for (String pp : perms) {
if (permissions.has(defworld, player, name + "." + pp)) {
hasperms.add(pp);
}
}
return hasperms;
}
@Override
public boolean hasOfflinePermission(String player, String perm) {
if(permissions == null)
permissions = ((Permissions)plugin).getHandler();
return permissions.has(defworld, player, name + "." + perm);
}
}
@@ -1,6 +1,7 @@
package org.dynmap.bukkit.permissions;
import java.util.HashSet;
import java.util.Set;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -24,4 +25,12 @@ public class OpPermissions implements PermissionProvider {
: true
: true;
}
@Override
public Set<String> hasOfflinePermissions(String player, Set<String> perms) {
return null;
}
@Override
public boolean hasOfflinePermission(String player, String perm) {
return false;
}
}
@@ -0,0 +1,65 @@
package org.dynmap.bukkit.permissions;
import java.util.HashSet;
import java.util.Set;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.dynmap.Log;
import ru.tehkode.permissions.PermissionManager;
import ru.tehkode.permissions.PermissionUser;
import ru.tehkode.permissions.bukkit.PermissionsEx;
public class PEXPermissions implements PermissionProvider {
String name;
PermissionManager pm;
public static PEXPermissions create(Server server, String name) {
Plugin permissionsPlugin = server.getPluginManager().getPlugin("PermissionsEx");
if (permissionsPlugin == null)
return null;
server.getPluginManager().enablePlugin(permissionsPlugin);
if(permissionsPlugin.isEnabled() == false)
return null;
if(PermissionsEx.isAvailable() == false)
return null;
Log.info("Using PermissionsEx " + permissionsPlugin.getDescription().getVersion() + " for access control");
return new PEXPermissions(name);
}
public PEXPermissions(String name) {
this.name = name;
pm = PermissionsEx.getPermissionManager();
}
@Override
public boolean has(CommandSender sender, String permission) {
Player player = sender instanceof Player ? (Player) sender : null;
return (player != null) ? pm.has(player, name + "." + permission) : true;
}
@Override
public Set<String> hasOfflinePermissions(String player, Set<String> perms) {
HashSet<String> hasperms = new HashSet<String>();
PermissionUser pu = pm.getUser(player);
if(pu != null) {
for (String pp : perms) {
if (pu.has(name + "." + pp)) {
hasperms.add(pp);
}
}
}
return hasperms;
}
@Override
public boolean hasOfflinePermission(String player, String perm) {
PermissionUser pu = pm.getUser(player);
if(pu != null) {
return pu.has(name + "." + perm);
}
return false;
}
}
@@ -0,0 +1,34 @@
package org.dynmap.bukkit.permissions;
import java.util.Map;
import org.bukkit.Server;
import org.bukkit.plugin.Plugin;
import org.dynmap.Log;
import com.platymuus.bukkit.permissions.PermissionsPlugin;
public class PermBukkitPermissions extends BukkitPermissions {
PermissionsPlugin plugin;
Map<String, Boolean> pd;
public static PermBukkitPermissions create(Server server, String name, Map<String, Boolean> pd) {
Plugin permissionsPlugin = server.getPluginManager().getPlugin("PermissionsBukkit");
if (permissionsPlugin == null)
return null;
server.getPluginManager().enablePlugin(permissionsPlugin);
if(permissionsPlugin.isEnabled() == false)
return null;
Log.info("Using PermissionsBukkit " + permissionsPlugin.getDescription().getVersion() + " for access control");
Log.info("Web interface permissions only available for online users");
return new PermBukkitPermissions(permissionsPlugin, name, pd);
}
public PermBukkitPermissions(Plugin permissionsPlugin, String name, Map<String, Boolean> pd) {
super(name, pd);
plugin = (PermissionsPlugin) permissionsPlugin;
this.pd = pd;
}
}
@@ -1,7 +1,14 @@
package org.dynmap.bukkit.permissions;
import java.util.Set;
import org.bukkit.command.CommandSender;
public interface PermissionProvider {
boolean has(CommandSender sender, String permission);
Set<String> hasOfflinePermissions(String player, Set<String> perms);
boolean hasOfflinePermission(String player, String perm);
}
@@ -0,0 +1,82 @@
package org.dynmap.bukkit.permissions;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.bukkit.Server;
import org.bukkit.plugin.Plugin;
import org.dynmap.Log;
import de.bananaco.bpermissions.api.User;
import de.bananaco.bpermissions.api.WorldManager;
public class bPermPermissions extends BukkitPermissions {
WorldManager wm;
public static bPermPermissions create(Server server, String name, Map<String,Boolean> pd) {
Plugin permissionsPlugin = server.getPluginManager().getPlugin("bPermissions");
if (permissionsPlugin == null)
return null;
server.getPluginManager().enablePlugin(permissionsPlugin);
if(permissionsPlugin.isEnabled() == false)
return null;
Log.info("Using bPermissions " + permissionsPlugin.getDescription().getVersion() + " for access control");
return new bPermPermissions(name, pd);
}
public bPermPermissions(String name, Map<String,Boolean> pd) {
super(name, pd);
wm = WorldManager.getInstance();
}
@Override
public Set<String> hasOfflinePermissions(String player, Set<String> perms) {
HashSet<String> hasperms = new HashSet<String>();
User usr = wm.getDefaultWorld().getUser(player);
if(usr != null) {
try { usr.calculateEffectivePermissions(); } catch (Exception x) {}
Map<String,Boolean> p = usr.getMappedPermissions();
for (String pp : perms) {
String permval = name + "." + pp;
Boolean v = p.get(permval);
if (v != null) {
if(v.booleanValue())
hasperms.add(permval);
}
else {
v = pd.get(permval);
if((v != null) && v.booleanValue())
hasperms.add(permval);
}
}
}
return hasperms;
}
@Override
public boolean hasOfflinePermission(String player, String perm) {
boolean rslt;
String permval = name + "." + perm;
User usr = wm.getDefaultWorld().getUser(player);
if(usr != null) {
try { usr.calculateEffectivePermissions(); } catch (Exception x) {}
if(usr.getMappedPermissions().containsKey(permval)) {
rslt = usr.hasPermission(permval);
}
else {
Boolean v = pd.get(permval);
if(v != null)
rslt = v;
else
rslt = false;
}
}
else {
rslt = false;
}
return rslt;
}
}
@@ -1,305 +0,0 @@
package org.dynmap.herochat;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.List;
import org.bukkit.event.CustomEventListener;
import org.bukkit.event.Event;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.server.PluginEnableEvent;
import org.bukkit.event.server.ServerListener;
import org.bukkit.plugin.Plugin;
import org.dynmap.Client;
import org.dynmap.ConfigurationNode;
import org.dynmap.DynmapCore;
import org.dynmap.Log;
import org.dynmap.bukkit.DynmapPlugin;
/**
* Bukkit specific module - alternate chat handler for interfacing with HeroChat
*/
public class HeroChatHandler {
private static final String DEF_CHANNEL = "Global";
private static final List<String> DEF_CHANNELS = Collections
.singletonList(DEF_CHANNEL);
private List<String> hcchannels;
private String hcwebinputchannel;
private DynmapCore core;
private HeroChatChannel hcwebinputchan;
private class OurPluginListener implements Listener {
@EventHandler
public void onPluginEnable(PluginEnableEvent event) {
Plugin plugin = event.getPlugin();
String name = plugin.getDescription().getName();
if (name.equals("HeroChat")) {
activateHeroChat(plugin);
}
}
}
/* Reflection-based access wrapper for ChannelChatEvent from HeroChat */
private static class HeroChatChannelChatEvent {
@SuppressWarnings("rawtypes")
private static Class channelchatevent;
private static Method getsource;
private static Method getmessage;
private static Method issentbyplayer;
private static boolean isgood = false;
private Event evt;
@SuppressWarnings("unchecked")
public static boolean initialize() {
try {
channelchatevent = Class
.forName("com.herocraftonline.dthielke.herochat.event.ChannelChatEvent");
getsource = channelchatevent.getMethod("getSource", new Class[0]);
getmessage = channelchatevent.getMethod("getMessage", new Class[0]);
issentbyplayer = channelchatevent.getMethod("isSentByPlayer", new Class[0]);
isgood = true;
} catch (ClassNotFoundException cnfx) {
} catch (NoSuchMethodException nsmx) {
}
return isgood;
}
public HeroChatChannelChatEvent(Event evt) {
this.evt = evt;
}
public static boolean isInstance(Event evt) {
return channelchatevent.isInstance(evt);
}
public String getSource() {
try {
return (String) getsource.invoke(evt);
} catch (Exception x) {
return null;
}
}
public String getMessage() {
try {
return (String) getmessage.invoke(evt);
} catch (Exception x) {
return null;
}
}
public boolean isSentByPlayer() {
try {
return (Boolean) issentbyplayer.invoke(evt);
} catch (Exception x) {
return true;
}
}
}
/* Reflection-based access wrapper for ChannelEvent from HeroChat */
private static class HeroChatChannelEvent {
@SuppressWarnings("rawtypes")
private static Class channelevent;
private static Method getchannel;
private static Method iscancelled;
private static boolean isgood = false;
private Event evt;
@SuppressWarnings("unchecked")
public static boolean initialize() {
try {
channelevent = Class
.forName("com.herocraftonline.dthielke.herochat.event.ChannelEvent");
getchannel = channelevent.getMethod("getChannel", new Class[0]);
iscancelled = channelevent.getMethod("isCancelled", new Class[0]);
isgood = true;
} catch (ClassNotFoundException cnfx) {
} catch (NoSuchMethodException nsmx) {
}
return isgood;
}
public HeroChatChannelEvent(Event evt) {
this.evt = evt;
}
public static boolean isInstance(Event evt) {
return channelevent.isInstance(evt);
}
public HeroChatChannel getChannel() {
try {
Object o;
o = getchannel.invoke(evt);
if (o != null) {
return new HeroChatChannel(o);
}
} catch (Exception x) {
}
return null;
}
public boolean isCancelled() {
try {
return (Boolean) iscancelled.invoke(evt);
} catch (Exception x) {
return true;
}
}
}
/* Reflection-based access wrapper for Channel from HeroChat */
private static class HeroChatChannel {
@SuppressWarnings("rawtypes")
private static Class channel;
private static Method getname;
private static Method getnick;
private static Method sendmessage;
private static boolean isgood = false;
private Object chan;
@SuppressWarnings("unchecked")
public static boolean initialize() {
try {
channel = Class
.forName("com.herocraftonline.dthielke.herochat.channels.Channel");
getname = channel.getMethod("getName");
getnick = channel.getMethod("getNick", new Class[0]);
sendmessage = channel.getMethod("sendMessage", new Class[] {
String.class, String.class, String.class, boolean.class } );
isgood = true;
} catch (ClassNotFoundException cnfx) {
} catch (NoSuchMethodException nsmx) {
Log.severe(nsmx);
}
return isgood;
}
public HeroChatChannel(Object chan) {
this.chan = chan;
}
public String getName() {
try {
return (String) getname.invoke(chan);
} catch (Exception x) {
return null;
}
}
public String getNick() {
try {
return (String) getnick.invoke(chan);
} catch (Exception x) {
return null;
}
}
public void sendMessage(String source, String msg, String format, boolean sentByPlayer) {
try {
sendmessage.invoke(chan, source, msg, format, sentByPlayer);
} catch (Exception x) {
}
}
}
private class OurEventListener extends CustomEventListener {
/**
* Handle custom events
*/
@EventHandler
public void onCustomEvent(Event event) {
if (HeroChatChannelEvent.isInstance(event)) {
HeroChatChannelEvent ce = new HeroChatChannelEvent(event);
/* Snoop for our web channel - we'll need it, and we'll see it before it matters,
* since anyone that joins the channel will give us an event (and reflection on
* the plugin class to get the manager didn't work, due to a dependency on the IRC
* plugin that may not be present....)
*/
HeroChatChannel c = ce.getChannel();
if (ce.isCancelled())
return;
if((hcwebinputchannel != null) && ((hcwebinputchannel.equals(c.getName())) ||
(hcwebinputchannel.equals(c.getNick())))) {
hcwebinputchan = c;
}
if (HeroChatChannelChatEvent.isInstance(event)) {
HeroChatChannelChatEvent cce = new HeroChatChannelChatEvent(
event);
/* Match on name or nickname of channel */
if (hcchannels.contains(c.getName()) ||
hcchannels.contains(c.getNick())) {
if(cce.isSentByPlayer()) { /* Player message? */
org.bukkit.entity.Player p = DynmapPlugin.plugin.getServer().getPlayer(cce.getSource());
if((p != null) && (core.mapManager != null)) {
core.mapManager.pushUpdate(new Client.ChatMessage("player",
c.getNick(),
p.getDisplayName(),
cce.getMessage(),
p.getName()));
}
}
}
}
}
}
}
public HeroChatHandler(ConfigurationNode cfg, DynmapCore core) {
/* If we're enabling hero chat support */
Log.verboseinfo("HeroChat support configured");
this.core = core;
/* Now, get the monitored channel list */
hcchannels = cfg.getStrings("herochatchannels", DEF_CHANNELS);
/* And get channel to send web messages */
hcwebinputchannel = cfg.getString("herochatwebchannel", DEF_CHANNEL);
Plugin hc = DynmapPlugin.plugin.getServer().getPluginManager().getPlugin("HeroChat");
if(hc != null) {
activateHeroChat(hc);
}
else {
/* Set up to hear when HeroChat is enabled */
DynmapPlugin.plugin.pm.registerEvents(new OurPluginListener(), DynmapPlugin.plugin);
}
}
private void activateHeroChat(Plugin herochat) {
if (HeroChatChannelChatEvent.initialize() == false) {
Log.severe("Cannot load HeroChat chat event class!");
return;
}
if (HeroChatChannel.initialize() == false) {
Log.severe("Cannot load HeroChat channel class!");
return;
}
if (HeroChatChannelEvent.initialize() == false) {
Log.severe("Cannot load HeroChat channel event class!");
return;
}
/* Register event handler */
DynmapPlugin.plugin.pm.registerEvent(Event.Type.CUSTOM_EVENT, new OurEventListener(), Event.Priority.Monitor, DynmapPlugin.plugin);
Log.verboseinfo("HeroChat integration active");
}
/**
* Send message from web to appropriate HeroChat channel
* @param sender - sender ID
* @param message - message
* @return true if herochat is handling this, false if not
*/
public boolean sendWebMessageToHeroChat(String sender, String message) {
if(hcwebinputchannel != null) { /* Are we handling them? */
if(hcwebinputchan != null) { /* Have we seen it yet? Maybe no if nobody has logged on or
* joined it, but then who would see it anyway?
*/
hcwebinputchan.sendMessage(sender, message, "{default}", false);
}
return true;
}
return false;
}
}
@@ -1,68 +0,0 @@
package org.dynmap.herochat;
import static org.dynmap.JSONUtils.s;
import org.dynmap.ChatEvent;
import org.dynmap.Client;
import org.dynmap.Component;
import org.dynmap.ConfigurationNode;
import org.dynmap.DynmapCore;
import org.dynmap.Event;
import org.dynmap.common.DynmapListenerManager;
import org.dynmap.common.DynmapListenerManager.EventType;
import org.dynmap.common.DynmapPlayer;
import org.json.simple.JSONObject;
public class HeroWebChatComponent extends Component {
HeroChatHandler handler;
public HeroWebChatComponent(final DynmapCore plugin, ConfigurationNode configuration) {
super(plugin, configuration);
handler = new HeroChatHandler(configuration, plugin);
plugin.events.addListener("webchat", new Event.Listener<ChatEvent>() {
@Override
public void triggered(ChatEvent t) {
if(plugin.getServer().sendWebChatEvent(t.source, t.name, t.message)) {
/* Let HeroChat take a look - only broadcast to players if it doesn't handle it */
if (!handler.sendWebMessageToHeroChat(t.name, t.message)) {
String msg;
String msgfmt = plugin.configuration.getString("webmsgformat", null);
if(msgfmt != null) {
msgfmt = unescapeString(msgfmt);
msg = msgfmt.replace("%playername%", t.name).replace("%message%", t.message);
}
else {
msg = unescapeString(plugin.configuration.getString("webprefix", "\u00A72[WEB] ")) + t.name + ": " + unescapeString(plugin.configuration.getString("websuffix", "\u00A7f")) + t.message;
}
plugin.getServer().broadcastMessage(msg);
}
}
}
});
plugin.events.addListener("buildclientconfiguration", new Event.Listener<JSONObject>() {
@Override
public void triggered(JSONObject t) {
s(t, "allowchat", true);
}
});
// Also make HeroChat announce joins and quits.
core.listenerManager.addListener(EventType.PLAYER_JOIN, new DynmapListenerManager.PlayerEventListener() {
@Override
public void playerEvent(DynmapPlayer p) {
if((core.mapManager != null) && (core.playerList != null) && (core.playerList.isVisiblePlayer(p.getName()))) {
core.mapManager.pushUpdate(new Client.PlayerJoinMessage(p.getDisplayName(), p.getName()));
}
}
});
core.listenerManager.addListener(EventType.PLAYER_QUIT, new DynmapListenerManager.PlayerEventListener() {
@Override
public void playerEvent(DynmapPlayer p) {
if((core.mapManager != null) && (core.playerList != null) && (core.playerList.isVisiblePlayer(p.getName()))) {
core.mapManager.pushUpdate(new Client.PlayerQuitMessage(p.getDisplayName(), p.getName()));
}
}
});
}
}

Some files were not shown because too many files have changed in this diff Show More