Guest User

Untitled

a guest
Mar 22nd, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.70 KB | None | 0 0
  1. //-------------- Time Token --------------//
  2.  
  3. // kita panggil nilai yang berubah per waktu sebagai time token. yes.
  4. // kenapa ini dibuat? Karena countdown playfab sucks.
  5.  
  6. // -------- yang ini nanti tertulis di title data user pas manggil useTimeToken.
  7. var TT_PREFIX = "TT_";
  8.  
  9. // // isi dari token
  10. // var TIMETOKEN_VALUE_PREFIX = "TTValue_";
  11. // // terakhir kali si token dipakai
  12. // var TIMETOKEN_TIME_PREFIX = "TTTime_";
  13. // // terakhir kali si token nge-regenerate
  14. // var TIMETOKEN_LASTREGEN_PREFIX = "TTLastRegen_";
  15.  
  16.  
  17. // ------- yang ini mah tulis manual di title data, bukan di user, tapi di app.
  18. // banyaknya waktu (dalam detik) yang diperlukan untuk merecharge
  19. var TIMETOKEN_RECHARGETIME_PREFIX = "TTRechargeTime_";
  20. // nilai maksimum dimiliki token
  21. var TIMETOKEN_MAXVALUE_PREFIX = "TTMax_";
  22.  
  23.  
  24. var TIMETOKEN_ERR_NOKEY = "NO_KEY";
  25.  
  26. var TIMETOKEN_KEY_TIME = "Time"; //for current time
  27. var TIMETOKEN_KEY_LASTREGEN = "LastRegen";
  28.  
  29. var TIMETOKEN_KEY_CURRENTVALUE = "CurrentValue";
  30. var TIMETOKEN_KEY_RECHARGETIME = "RechargeTime";
  31. var TIMETOKEN_KEY_RECHARGEMAX = "RechargeMax";
  32. var TIMETOKEN_KEY_SECONDSTORECHARGE = "SecondsToRecharge";
  33. var TIMETOKEN_KEY_ERROR = "Error";
  34.  
  35. function createToken(timeTokenId, value)
  36. {
  37. log.info("create token:" + timeTokenId + " by " + value);
  38. var dataKey = TT_PREFIX + timeTokenId;
  39. // var timeTokenValue = TIMETOKEN_VALUE_PREFIX + timeTokenId;
  40. // var timeTokenTime = TIMETOKEN_TIME_PREFIX + timeTokenId;
  41. // var timeTokenLastRegen = TIMETOKEN_LASTREGEN_PREFIX + timeTokenId;
  42.  
  43. var currentTime = new Date();
  44.  
  45. var writeToServer = { };
  46.  
  47. var data = {};
  48. data[TIMETOKEN_KEY_CURRENTVALUE] = value;
  49. data[TIMETOKEN_KEY_TIME] = currentTime;
  50. data[TIMETOKEN_KEY_LASTREGEN] = currentTime;
  51.  
  52. writeToServer[dataKey] = JSON.stringify(data);
  53.  
  54. // writeToServer[timeTokenValue] = value;
  55. // writeToServer[timeTokenTime] = currentTime;
  56. // writeToServer[timeTokenLastRegen] = currentTime;
  57.  
  58. // server.UpdateUserReadOnlyData({"PlayFabId" : currentPlayerId, "Data" : writeToServer, "Permission":"Private"});
  59. server.UpdateUserReadOnlyData({"PlayFabId" : currentPlayerId, "Data" : writeToServer, "Permission":"Private"});
  60. }
  61.  
  62. // Kalau mau pakai time token gunakan fungsi ini
  63. function addTimeTokenValue(timeTokenId, value)
  64. {
  65. var dataKey = TT_PREFIX + timeTokenId;
  66.  
  67. // var timeTokenValue = TIMETOKEN_VALUE_PREFIX + timeTokenId;
  68. // var timeTokenTime = TIMETOKEN_TIME_PREFIX + timeTokenId;
  69. // var timeTokenLastRegen = TIMETOKEN_LASTREGEN_PREFIX + timeTokenId;
  70.  
  71. var data = {};
  72.  
  73. var returnValue = {};
  74. var timeTokenInfo = getTimeTokenInfo(timeTokenId);
  75.  
  76. if (timeTokenInfo[TIMETOKEN_KEY_ERROR] == null){
  77.  
  78. var prevValue = parseInt(timeTokenInfo[TIMETOKEN_KEY_CURRENTVALUE]);
  79.  
  80. var totalValue = prevValue + parseInt(value);
  81. // jangan melebihi nilai max
  82. if (totalValue > timeTokenInfo[TIMETOKEN_KEY_RECHARGEMAX]) {
  83. totalValue = timeTokenInfo[TIMETOKEN_KEY_RECHARGEMAX];
  84. }
  85.  
  86.  
  87. var currentTime = new Date();
  88. var writeToServer = {};
  89.  
  90. // kalau yang sebelumnya udah max, anggap regennya baru diambil sekarang
  91. // supaya nggak langsung diregenerate
  92. // misal: mainnya kemarin, padahal udah max, dan baru mainnya sekarang
  93. // jadi pas main kedua gak ngambil last regenerate hari kemarin, tapi dari terakhir kali dipakai
  94. // (jadi baru countdown regenerate pas ada nilai yang perlu diregenerate)
  95. if (prevValue >= timeTokenInfo[TIMETOKEN_KEY_RECHARGEMAX] ) {
  96. // writeToServer[timeTokenLastRegen] = new Date();
  97. data[TIMETOKEN_KEY_LASTREGEN] = new Date();
  98. }else{
  99. data[TIMETOKEN_KEY_LASTREGEN] = timeTokenInfo[TIMETOKEN_KEY_LASTREGEN];
  100. }
  101.  
  102. // writeToServer[timeTokenValue] = totalValue;
  103. // writeToServer[timeTokenTime] = currentTime;
  104. data[TIMETOKEN_KEY_CURRENTVALUE] = totalValue;
  105. data[TIMETOKEN_KEY_TIME] = currentTime;
  106.  
  107. writeToServer[dataKey] = JSON.stringify(data);
  108. server.UpdateUserReadOnlyData({"PlayFabId" : currentPlayerId, "Data" : writeToServer, "Permission":"Private"});
  109.  
  110. var addedTimeTokenInfo = getTimeTokenInfo(timeTokenId);
  111. returnValue[TIMETOKEN_KEY_CURRENTVALUE] = addedTimeTokenInfo[TIMETOKEN_KEY_CURRENTVALUE];
  112. returnValue[TIMETOKEN_KEY_RECHARGETIME] = addedTimeTokenInfo[TIMETOKEN_KEY_RECHARGETIME];
  113. returnValue[TIMETOKEN_KEY_RECHARGEMAX] = addedTimeTokenInfo[TIMETOKEN_KEY_RECHARGEMAX];
  114. returnValue[TIMETOKEN_KEY_SECONDSTORECHARGE] = addedTimeTokenInfo[TIMETOKEN_KEY_SECONDSTORECHARGE];
  115. returnValue[TIMETOKEN_KEY_ERROR] = addedTimeTokenInfo[TIMETOKEN_KEY_ERROR];
  116. }else{
  117. returnValue[TIMETOKEN_KEY_CURRENTVALUE] = null;
  118. returnValue[TIMETOKEN_KEY_RECHARGETIME] = null;
  119. returnValue[TIMETOKEN_KEY_RECHARGEMAX] = null;
  120. returnValue[TIMETOKEN_KEY_SECONDSTORECHARGE] = null;
  121. returnValue[TIMETOKEN_KEY_ERROR] = TIMETOKEN_ERR_NOKEY;
  122. }
  123. return returnValue;
  124. }
  125.  
  126. function setRegenToken(timeTokenId, currentValue, lastRegen, lastUsedTime) {
  127. var dataKey = TT_PREFIX + timeTokenId;
  128. // var timeTokenValue = TIMETOKEN_VALUE_PREFIX + timeTokenId;
  129. // var timeTokenLastRegen = TIMETOKEN_LASTREGEN_PREFIX + timeTokenId;
  130.  
  131. var timeTokenObj = {};
  132. timeTokenObj[TIMETOKEN_KEY_CURRENTVALUE] = currentValue;
  133. timeTokenObj[TIMETOKEN_KEY_LASTREGEN] = lastRegen;
  134. timeTokenObj[TIMETOKEN_KEY_TIME] = lastUsedTime;
  135.  
  136.  
  137. var writeToServer = {};
  138. writeToServer[dataKey] = JSON.stringify(timeTokenObj);
  139. server.UpdateUserReadOnlyData({"PlayFabId" : currentPlayerId, "Data" : writeToServer, "Permission":"Private"});
  140. }
  141.  
  142. function deleteTimeToken(timeTokenId)
  143. {
  144. var dataKey = TT_PREFIX + timeTokenId;
  145.  
  146. server.UpdateUserReadOnlyData({"PlayFabId": currentPlayerId,
  147. "KeysToRemove":
  148. [dataKey]
  149. });
  150. }
  151.  
  152. // mirip-mirip dengan fungsinya si playfab
  153. function getTimeTokenInfo(timeTokenId)
  154. {
  155. var dataKey = TT_PREFIX + timeTokenId;
  156.  
  157. var returnValue= {};
  158.  
  159. // user title data
  160. // var timeTokenValue = TIMETOKEN_VALUE_PREFIX + timeTokenId;
  161. // var timeTokenTime = TIMETOKEN_TIME_PREFIX + timeTokenId;
  162. // var timeTokenLastRegen = TIMETOKEN_LASTREGEN_PREFIX + timeTokenId;
  163.  
  164. // title data
  165. // var timeTokenRechargeTime = TIMETOKEN_RECHARGETIME_PREFIX + timeTokenId;
  166. // var timeTokenMaxValue = TIMETOKEN_MAXVALUE_PREFIX + timeTokenId;
  167.  
  168. var ttMaxValue = 0;
  169. var ttRechargeTime = 0;
  170. var secondsToRecharge = 0;
  171.  
  172. // dapatkan informasi dari title data
  173. var titleParams = {};
  174. // titleParams.Keys = [timeTokenRechargeTime, timeTokenMaxValue];
  175. titleParams.Keys = [dataKey];
  176. var RawTitle = server.GetTitleData(titleParams);
  177.  
  178. // cek kita punya informasi token ini di game title data
  179. if (RawTitle.Data.hasOwnProperty(dataKey)) {
  180.  
  181. var timeTokenObj = JSON.parse(RawTitle.Data[dataKey]);
  182.  
  183. // ttRechargeTime = parseInt(RawTitle.Data[timeTokenRechargeTime]);
  184. // ttMaxValue = parseInt(RawTitle.Data[timeTokenMaxValue]);
  185. ttRechargeTime = parseInt(timeTokenObj[TIMETOKEN_KEY_RECHARGETIME]);
  186. ttMaxValue = parseInt(timeTokenObj[TIMETOKEN_KEY_RECHARGEMAX]);
  187.  
  188. var userToken = server.GetUserReadOnlyData({
  189. PlayFabId: currentPlayerId,
  190. Keys: [dataKey]
  191. });
  192.  
  193. if (userToken.Data[dataKey] != null && userToken.Data[dataKey] != undefined) {
  194.  
  195. var userTimeTokenObj = JSON.parse(userToken.Data[dataKey].Value);
  196.  
  197. // var ttValue = parseInt(userToken.Data[timeTokenValue].Value);
  198. // var ttLastTime = userToken.Data[timeTokenTime].Value;
  199. // var ttLastRegen = userToken.Data[timeTokenLastRegen].Value;
  200. var ttValue = parseInt(userTimeTokenObj[TIMETOKEN_KEY_CURRENTVALUE]);
  201. var ttLastTime = userTimeTokenObj[TIMETOKEN_KEY_TIME];
  202. var ttLastRegen = userTimeTokenObj[TIMETOKEN_KEY_LASTREGEN];
  203.  
  204.  
  205. log.info("current value:" + ttValue);
  206.  
  207. // ----------- update ngegenerate ----------- //
  208.  
  209. // generate kalau nilai sekarang lebih kecil daripada max
  210. if (ttValue < ttMaxValue) {
  211. // hitung harus berapa banyak di regenerate
  212. var lastRegenElapsed = getTimeElapsed(ttLastRegen);
  213. log.info("last regen elapsed:" + lastRegenElapsed);
  214. var regenVal = parseInt(Math.floor(lastRegenElapsed/ttRechargeTime));
  215.  
  216. // kalau udah lebih, kasih max valuenya aja
  217. if (regenVal >= ttMaxValue) {
  218. regenVal = ttMaxValue;
  219. }
  220.  
  221. log.info("ttMaxValue:" + ttMaxValue);
  222. log.info("ttRecharge time:" + ttRechargeTime);
  223. log.info("regenVal:" + regenVal);
  224. if (regenVal > 0) {
  225. var regeneratedValue = ttValue + regenVal;
  226.  
  227. // tambahkan regenerate, tapi jangan kelebihan
  228. if (regeneratedValue < ttMaxValue) {
  229. log.info("regenerated value:" + regeneratedValue);
  230.  
  231. // set waktu pura-puranya di regen pas jam segitu
  232. var totalRegenSecond = ttRechargeTime * regenVal;
  233. log.info("total regen second:" + totalRegenSecond);
  234. var targetRegenTime = new Date(ttLastRegen);
  235. targetRegenTime.setSeconds(targetRegenTime.getSeconds() + totalRegenSecond);
  236.  
  237. setRegenToken(timeTokenId, regeneratedValue, targetRegenTime, ttLastTime);
  238.  
  239. log.info("last regen time:" + ttLastRegen);
  240. log.info("target regenerated time:" + targetRegenTime);
  241. log.info("now:" + new Date());
  242.  
  243. ttValue = regeneratedValue;
  244. }else{
  245. // kalau kelebihan, set jadi max saja
  246.  
  247. var prevUnregenerated = ttMaxValue - ttValue;
  248. log.info("prev unregen:" + prevUnregenerated);
  249.  
  250. // set waktu pura-puranya di regen pas jam segitu
  251. var totalRegenSecond = ttRechargeTime * prevUnregenerated;
  252. log.info("total regen second:" + totalRegenSecond);
  253. var targetRegenTime = new Date(ttLastRegen);
  254. targetRegenTime.setSeconds(targetRegenTime.getSeconds() + totalRegenSecond);
  255.  
  256. setRegenToken(timeTokenId, ttMaxValue, targetRegenTime, ttLastTime);
  257.  
  258. log.info("last time:" + ttLastRegen);
  259. log.info("regenerated time:" + targetRegenTime);
  260. log.info("now:" + new Date());
  261.  
  262. log.info("regenerated max:" + regeneratedValue + " to " + ttMaxValue);
  263. ttValue = ttMaxValue;
  264. }
  265. }
  266.  
  267. // tunjukkan countdown kalau ada nilai yang perlu ditambah
  268. if (ttValue < ttMaxValue) {
  269. secondsToRecharge = ttRechargeTime-(lastRegenElapsed % ttRechargeTime);
  270.  
  271. if (secondsToRecharge < 0)
  272. secondsToRecharge = 0;
  273.  
  274. log.info("secondsToRecharge:" + secondsToRecharge);
  275. }else{
  276. secondsToRecharge = 0;
  277. log.info("secondsToRecharge:" + secondsToRecharge);
  278. }
  279.  
  280. }else{
  281.  
  282. //nilai sekarang lebih besar daripada max, tak ada waktu berikutnya
  283.  
  284. secondsToRecharge = 0
  285.  
  286. log.info("value maxed. secondsToRecharge:" + secondsToRecharge);
  287. }
  288.  
  289. returnValue[TIMETOKEN_KEY_CURRENTVALUE] = ttValue;
  290. returnValue[TIMETOKEN_KEY_RECHARGETIME] = ttRechargeTime;
  291. returnValue[TIMETOKEN_KEY_RECHARGEMAX] = ttMaxValue;
  292. returnValue[TIMETOKEN_KEY_SECONDSTORECHARGE] = secondsToRecharge;
  293. returnValue[TIMETOKEN_KEY_ERROR] = null;
  294.  
  295. }else{
  296. log.info("get but has no token, then create: " + timeTokenId + " by " + ttMaxValue);
  297. createToken(timeTokenId, ttMaxValue);
  298.  
  299. // default value
  300. returnValue[TIMETOKEN_KEY_CURRENTVALUE] = ttMaxValue;
  301. returnValue[TIMETOKEN_KEY_RECHARGETIME] = ttRechargeTime;
  302. returnValue[TIMETOKEN_KEY_RECHARGEMAX] = ttMaxValue;
  303. returnValue[TIMETOKEN_KEY_ERROR] = null;
  304.  
  305.  
  306. // baru diisi, jadi beri saja nilai 0
  307. returnValue[TIMETOKEN_KEY_SECONDSTORECHARGE] = 0;
  308. }
  309.  
  310. return returnValue;
  311.  
  312. }else{
  313. // gak ada key ini di title data game
  314.  
  315. log.info("ERROR no timetoken with key " + timeTokenId + " in title data");
  316.  
  317. returnValue[TIMETOKEN_KEY_CURRENTVALUE] = null;
  318. returnValue[TIMETOKEN_KEY_RECHARGETIME] = null;
  319. returnValue[TIMETOKEN_KEY_RECHARGEMAX] = null;
  320. returnValue[TIMETOKEN_KEY_SECONDSTORECHARGE] = null;
  321. returnValue[TIMETOKEN_KEY_ERROR] = TIMETOKEN_ERR_NOKEY;
  322. return returnValue;
  323. }
  324.  
  325.  
  326. }
  327.  
  328.  
  329. // dapatkan waktu
  330. function getTimeElapsed(lastTimeStr)
  331. {
  332. var currentTime = new Date();
  333. var lastTime = new Date(lastTimeStr);
  334. var timeDiff = currentTime.getTime() - lastTime.getTime();
  335. var timeDiff_seconds = timeDiff/1000;
  336.  
  337. return timeDiff_seconds;
  338. }
  339.  
  340. handlers.GetTimeTokenInfo = function (args, context)
  341. {
  342. var timeTokenId = args.timeTokenId;
  343.  
  344. return getTimeTokenInfo(timeTokenId);
  345. }
  346.  
  347. handlers.AddTimeToken = function (args, context)
  348. {
  349. var timeTokenId = args.timeTokenId;
  350. var value = args.value;
  351. return addTimeTokenValue(timeTokenId, value);
  352.  
  353. }
  354.  
  355.  
  356.  
  357.  
  358.  
  359. //-------------- End Time Token --------------//
Add Comment
Please, Sign In to add comment